FranklinWH API

The FranklinWH partner API - a unified developer access platform for authorised partners to connect to FranklinWH systems. Thirty-eight operations across a standard namespace (/api-common/) covering sites, device inventory, device parameters and running status, power/energy/telemetry data, historical warnings and backup events, time-of-use profiles, aPower switch control, smart circuits, grid events, device grouping and a modification audit log; plus a Sunrun-specific namespace (/api-sunrun/). Token authentication: a cp/ck credential pair is exchanged at /api-common/tokenizer for a token sent in the Authorization header.

OpenAPI Specification

franklin-whole-home-openapi.yml Raw ↑
openapi: 3.1.0
info:
  title: FranklinWH API
  version: '1.0'
  summary: Partner API for the FranklinWH (Franklin Whole Home) residential energy storage platform.
  description: 'Machine-readable rendering of the FranklinWH partner API as published by FranklinWH''s own API portal at https://api.franklinwh.com/
    (portal title `FWH-API-Service`, author `FWH`, version 1.0). The portal ships its complete operation catalogue - paths,
    HTTP methods, parameter names, locations, types, requirement flags and value notes - as a static, publicly retrievable
    JavaScript module; this OpenAPI document is a faithful format conversion of that catalogue. Nothing has been added that
    the portal does not publish. Response payload schemas are NOT published by the portal, so only the observed response envelope
    is modelled here.


    The API covers site and device inventory, telemetry and energy data, warnings and backup events, time-of-use profiles,
    smart-circuit and grid-event control, aPower battery start/stop, device grouping and an operation audit log, plus a Sunrun-specific
    namespace (`/api-sunrun/`).


    Authentication: POST /api-common/tokenizer with a `cp` / `ck` credential pair returns a token that is sent on every other
    operation in the `Authorization` header.


    Base URL: the only base URL FranklinWH publishes publicly is the free test environment, https://test-api.franklinwh.com.
    The production base URL is issued to authorised partners during onboarding and is not published.'
  contact:
    name: FranklinWH Support
    email: service@franklinwh.com
    url: https://www.franklinwh.com/support/contact/
  x-provenance:
    method: derived
    source: https://api.franklinwh.com/js/apiList-eQeWKe2I.js
    source_portal: https://api.franklinwh.com/
    derived: '2026-08-16'
    note: Converted from the FranklinWH API portal's own published operation catalogue. Operations, parameters and request
      examples are verbatim from that catalogue; no operation, parameter or schema was invented.
servers:
- url: https://test-api.franklinwh.com
  description: Free test environment - the only base URL FranklinWH publishes publicly (portal `host` / `basePath`).
tags:
- name: Authentication
  description: Token issuance for the FranklinWH partner API.
- name: Sites
  description: Site records — query, list, modify and delete.
- name: Devices
  description: Device inventory, device information and device parameters.
- name: Device Data
  description: Power, energy, telemetry, inventory and historical load data.
- name: Warnings and Events
  description: Historical device warnings and backup (outage) events.
- name: System Settings
  description: Time-of-use profiles, aPower switch control and smart-circuit settings.
- name: Grid Events
  description: Grid-event scheduling and query.
- name: Groups
  description: Device grouping and bulk settings applied by group.
- name: Modification Records
  description: Audit log of setting changes.
- name: Sunrun
  description: Sunrun-specific operations on the /api-sunrun namespace.
- name: Sunrun Sites
  description: Sunrun site asset inventory.
- name: Sunrun System Setup
  description: Sunrun energy-management and aPower switch control.
paths:
  /api-common/tokenizer:
    post:
      tags:
      - Authentication
      summary: Update Token
      operationId: tokenizer
      description: Fetch token by using CK CP
      security: []
      responses:
        '200':
          description: Envelope response. Non-zero `code` values (401 wrong token, 403 missing token or token param) are returned
            inside the envelope with HTTP 200.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiEnvelope'
        '404':
          description: Unknown path.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/NotFoundError'
  /api-common/querySiteInfo:
    get:
      tags:
      - Sites
      summary: Query Site Information
      operationId: querySiteInfo
      description: Query site information according to the site ID
      parameters:
      - name: siteId
        in: query
        required: true
        schema:
          type: integer
      responses:
        '200':
          description: Envelope response. Non-zero `code` values (401 wrong token, 403 missing token or token param) are returned
            inside the envelope with HTTP 200.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiEnvelope'
        '404':
          description: Unknown path.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/NotFoundError'
  /api-common/querySiteList:
    get:
      tags:
      - Sites
      summary: Query Site List
      operationId: querySiteList
      description: Get all site information, or the site information of its installers
      parameters:
      - name: installerId
        in: query
        required: false
        schema:
          type: integer
        description: Installer ID
      - name: siteName
        in: query
        required: false
        schema:
          type: string
        description: Site name
      - name: userAccount
        in: query
        required: false
        schema:
          type: string
        description: User account
      - name: deviceId
        in: query
        required: false
        schema:
          type: string
        description: Device ID
      - name: current
        in: query
        required: false
        schema:
          type: integer
        description: Current page. Start the query from page 1 and upload the page number that need to be queried. Defaults
          to the first page if not posted
      - name: pageSize
        in: query
        required: false
        schema:
          type: integer
        description: Display quantity per page. Number of data returned by the current page when queried. The default number
          is 20 if not posted. Maximum is 50
      responses:
        '200':
          description: Envelope response. Non-zero `code` values (401 wrong token, 403 missing token or token param) are returned
            inside the envelope with HTTP 200.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiEnvelope'
        '404':
          description: Unknown path.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/NotFoundError'
  /api-common/modifySite:
    post:
      tags:
      - Sites
      summary: Modify or Delete a Site
      operationId: modifySite
      description: Modify or delete a site
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                opt:
                  type: integer
                  description: Operation type. 1:Modify, 2:Delete
                siteId:
                  type: integer
                  description: Site ID
                siteName:
                  type: string
                  description: Site name
                longitude:
                  type: string
                  description: Longitude of the site
                latitude:
                  type: string
                  description: Latitude of the site
                address:
                  type: string
                  description: Site address
                postCode:
                  type: string
                  description: Zip code
                installerId:
                  type: integer
                  description: Installer ID
              required:
              - opt
              - siteId
      responses:
        '200':
          description: Envelope response. Non-zero `code` values (401 wrong token, 403 missing token or token param) are returned
            inside the envelope with HTTP 200.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiEnvelope'
        '404':
          description: Unknown path.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/NotFoundError'
  /api-common/queryDeviceList:
    get:
      tags:
      - Devices
      summary: Query Device List
      operationId: queryDeviceList
      description: Get device list information
      parameters:
      - name: current
        in: query
        required: false
        schema:
          type: integer
        description: Current page. Defaults to the first page if not posted
      - name: pageSize
        in: query
        required: false
        schema:
          type: integer
        description: Display quantity per page. The default number is 20 if not posted. Maximum is 50
      - name: installerId
        in: query
        required: false
        schema:
          type: integer
        description: Installer ID
      - name: deviceId
        in: query
        required: false
        schema:
          type: string
        description: Device ID
      - name: groupId
        in: query
        required: false
        schema:
          type: integer
        description: Group ID
      responses:
        '200':
          description: Envelope response. Non-zero `code` values (401 wrong token, 403 missing token or token param) are returned
            inside the envelope with HTTP 200.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiEnvelope'
        '404':
          description: Unknown path.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/NotFoundError'
  /api-common/editDeviceInfo:
    post:
      tags:
      - Devices
      summary: Edit Deivce Information
      operationId: editDeviceInfo
      description: Edit Deivce Information
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                deviceId:
                  type: string
                  description: Device id
                siteId:
                  type: integer
                  description: Site ID
                longitude:
                  type: string
                  description: Longitude of the device
                latitude:
                  type: string
                  description: Latitude of the device
                address:
                  type: string
                  description: Installation address
                installerId:
                  type: integer
                  description: Installer id
              required:
              - deviceId
      responses:
        '200':
          description: Envelope response. Non-zero `code` values (401 wrong token, 403 missing token or token param) are returned
            inside the envelope with HTTP 200.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiEnvelope'
        '404':
          description: Unknown path.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/NotFoundError'
  /api-common/queryDeviceParameters:
    get:
      tags:
      - Devices
      summary: Query device parameters
      operationId: queryDeviceParameters
      description: Query device parameters
      parameters:
      - name: deviceId
        in: query
        required: true
        schema:
          type: string
        description: Device id
      responses:
        '200':
          description: Envelope response. Non-zero `code` values (401 wrong token, 403 missing token or token param) are returned
            inside the envelope with HTTP 200.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiEnvelope'
        '404':
          description: Unknown path.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/NotFoundError'
  /api-common/queryDeviceRunningStatus:
    get:
      tags:
      - Devices
      summary: Query device running status
      operationId: queryDeviceRunningStatus
      description: Query device running status
      parameters:
      - name: deviceId
        in: query
        required: true
        schema:
          type: string
        description: Device id
      - name: type
        in: query
        required: true
        schema:
          type: integer
        description: 'Query type. 1: Running data (The latest data of the day) 2: Daily data (All 5 minutes data on the selected
          day, including today or history)'
      - name: queryDate
        in: query
        required: false
        schema:
          type: string
        description: Specific date. Required when the query type is 2
      responses:
        '200':
          description: Envelope response. Non-zero `code` values (401 wrong token, 403 missing token or token param) are returned
            inside the envelope with HTTP 200.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiEnvelope'
        '404':
          description: Unknown path.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/NotFoundError'
  /api-common/queryPowerData:
    get:
      tags:
      - Device Data
      summary: Query Power Data
      operationId: queryPowerData
      description: Get the latest data of the day or query all data on a specific date
      parameters:
      - name: deviceId
        in: query
        required: true
        schema:
          type: string
        description: Device id
      - name: type
        in: query
        required: true
        schema:
          type: integer
        description: 'Query type. 1: Running data (The latest data of the day) 2: Daily data (All 5 minutes data on the selected
          day, including today or history)'
      - name: queryDate
        in: query
        required: false
        schema:
          type: string
        description: Specific date. Only required when the query type is 2
      responses:
        '200':
          description: Envelope response. Non-zero `code` values (401 wrong token, 403 missing token or token param) are returned
            inside the envelope with HTTP 200.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiEnvelope'
        '404':
          description: Unknown path.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/NotFoundError'
  /api-common/getMaxPowerData:
    post:
      tags:
      - Device Data
      summary: Query Maximum Power Data
      operationId: getMaxPowerData
      description: Query the maximum power within defined periods
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                deviceId:
                  type: string
                  description: Device id
                type:
                  type: integer
                  description: 'Query type: 1: Day, 2:Week, 3:Month, 4:Year, 5:Total'
                queryDate:
                  type: integer
                  description: 'Date. When type is 2, calculate the week boundaries based on the selected date Required: When
                    type is 1-4; Not required: when type is 5'
              required:
              - deviceId
              - type
      responses:
        '200':
          description: Envelope response. Non-zero `code` values (401 wrong token, 403 missing token or token param) are returned
            inside the envelope with HTTP 200.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiEnvelope'
        '404':
          description: Unknown path.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/NotFoundError'
  /api-common/queryEnergyData:
    post:
      tags:
      - Device Data
      summary: Query Energy Data
      operationId: queryEnergyData
      description: Get the latest data or all energy data within defined periods
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                deviceId:
                  type: string
                  description: Device id
                type:
                  type: integer
                  description: 'Query type: 1: Day, 2:Week, 3:Month , 4:Year, 5:Total. Day: Data is returned at a time of
                    5 minutes. Week: Data is returned at a time for each day of the week. Month: Data is returned at a time
                    for each day of the month.Year: Data is returned at a time for each month of the year. Total: Data is
                    returned at a time for each year of the lifetime'
                queryDate:
                  type: string
                  description: 'Date. When type is 2, calculate the week boundaries based on the selected date Required: When
                    type is 1-4; Not required: when type is 5'
              required:
              - deviceId
              - type
      responses:
        '200':
          description: Envelope response. Non-zero `code` values (401 wrong token, 403 missing token or token param) are returned
            inside the envelope with HTTP 200.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiEnvelope'
        '404':
          description: Unknown path.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/NotFoundError'
  /api-common/queryPowerSourceDetails:
    post:
      tags:
      - Device Data
      summary: Query Power Source Details
      operationId: queryPowerSourceDetails
      description: Get the latest data about FHP, grid, and solar, or the data on a specific date
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                deviceId:
                  type: string
                  description: Device ID
                type:
                  type: integer
                  description: 'Query type. 1: Running data (The latest data of the day) 2: Daily data (All 15 minutes data
                    on the selected day, including today or history)'
                queryDate:
                  type: string
                  description: Query date. Only required when the query type is 2
              required:
              - deviceId
              - type
      responses:
        '200':
          description: Envelope response. Non-zero `code` values (401 wrong token, 403 missing token or token param) are returned
            inside the envelope with HTTP 200.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiEnvelope'
        '404':
          description: Unknown path.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/NotFoundError'
  /api-common/queryDeviceDataPool:
    get:
      tags:
      - Device Data
      summary: Query Telemetry Grouping
      operationId: queryDeviceDataPool
      description: Query Telemetry Grouping
      parameters:
      - name: deviceId
        in: query
        required: false
        schema:
          type: string
        description: Device ID. deviceId and siteId can not both null
      - name: siteId
        in: query
        required: false
        schema:
          type: integer
        description: SiteID. deviceId and siteId can not both null
      responses:
        '200':
          description: Envelope response. Non-zero `code` values (401 wrong token, 403 missing token or token param) are returned
            inside the envelope with HTTP 200.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiEnvelope'
        '404':
          description: Unknown path.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/NotFoundError'
  /api-common/queryInventory:
    get:
      tags:
      - Device Data
      summary: Query Inventory
      operationId: queryInventory
      description: Query Inventory
      parameters:
      - name: deviceId
        in: query
        required: false
        schema:
          type: string
        description: Device id
      - name: siteId
        in: query
        required: false
        schema:
          type: integer
        description: Site ID
      - name: siteName
        in: query
        required: false
        schema:
          type: string
        description: Site name. Need to be unique
      - name: current
        in: query
        required: false
        schema:
          type: integer
        description: Current Page. Defaults to the first page if not posted
      - name: pageSize
        in: query
        required: false
        schema:
          type: integer
        description: Display quantity per page. The default number is 20 if not posted. Maximum is 50
      responses:
        '200':
          description: Envelope response. Non-zero `code` values (401 wrong token, 403 missing token or token param) are returned
            inside the envelope with HTTP 200.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiEnvelope'
        '404':
          description: Unknown path.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/NotFoundError'
  /api-common/historyDataLoad:
    get:
      tags:
      - Device Data
      summary: Query Historical Data Load
      operationId: historyDataLoad
      description: Query Historical Data Load, this API offers total 7 days  running history data ( 5 min. Period )
      parameters:
      - name: siteName
        in: query
        required: false
        schema:
          type: string
        description: Site Name. siteNameand siteId can not both null
      - name: siteId
        in: query
        required: false
        schema:
          type: integer
        description: Site ID. siteNameand siteId can not both null
      responses:
        '200':
          description: Envelope response. Non-zero `code` values (401 wrong token, 403 missing token or token param) are returned
            inside the envelope with HTTP 200.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiEnvelope'
        '404':
          description: Unknown path.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/NotFoundError'
  /api-common/queryDeviceHistoricalWarning:
    get:
      tags:
      - Warnings and Events
      summary: Query Historical Warning
      operationId: queryDeviceHistoricalWarning
      description: Query historical warning data within a defined period, the time span should not exceed 1 month
      parameters:
      - name: deviceId
        in: query
        required: true
        schema:
          type: string
        description: Device id
      - name: queryStartTime
        in: query
        required: true
        schema:
          type: string
        description: Query start time. Device time
      - name: queryEndTime
        in: query
        required: true
        schema:
          type: string
        description: Query end time. Device time
      responses:
        '200':
          description: Envelope response. Non-zero `code` values (401 wrong token, 403 missing token or token param) are returned
            inside the envelope with HTTP 200.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiEnvelope'
        '404':
          description: Unknown path.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/NotFoundError'
  /api-common/queryBackupEvents:
    get:
      tags:
      - Warnings and Events
      summary: Query Backup Events
      operationId: queryBackupEvents
      description: Query backup events data within a defined period, the time span should not exceed 1 month
      parameters:
      - name: deviceId
        in: query
        required: true
        schema:
          type: string
        description: Device id
      - name: queryStartTime
        in: query
        required: true
        schema:
          type: string
        description: Query the start time of the start time. Device time
      - name: queryEndTime
        in: query
        required: true
        schema:
          type: string
        description: Query end time of the start time. Device time
      - name: current
        in: query
        required: false
        schema:
          type: integer
        description: Current page. Start the query from page 1 and upload the page number that need to be queried. Defaults
          to the first page if not posted
      - name: pageSize
        in: query
        required: false
        schema:
          type: integer
        description: Display quantity per page. Number of data returned by the current page when queried. The default number
          is 20 if not posted. Maximum is 50
      responses:
        '200':
          description: Envelope response. Non-zero `code` values (401 wrong token, 403 missing token or token param) are returned
            inside the envelope with HTTP 200.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiEnvelope'
        '404':
          description: Unknown path.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/NotFoundError'
  /api-common/setTouProfile:
    post:
      tags:
      - System Settings
      summary: Set TOU Profile
      operationId: setTouProfile
      description: Set energy TOU profile
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                deviceId:
                  type: string
                  description: Device id
                touId:
                  type: integer
                  description: TOU profile ID
                season:
                  type: array
                  items:
                    type: object
                  description: TOU profile season
              required:
              - deviceId
              - touId
              - season
            example:
              deviceId: 10080008B00A22150090
              touId: 10688
              season:
              - month: 5,6,7,8,9,10
                dayType: 1
                time:
                - startTime: 00:00
                  endTime: 08:00
                  waveType: 0
                  schedule: 8
                - startTime: 08:00
                  endTime: '21:00'
                  waveType: 1
                  schedule: 2
                - startTime: '21:00'
                  endTime: 08:00
                  waveType: 2
                  schedule: 1
              - month: 5,6,7,8,9,10
                dayType: 1
                time:
                - startTime: 00:00
                  endTime: 08:00
                  waveType: 0
                  schedule: 8
                - startTime: 08:00
                  endTime: '21:00'
                  waveType: 1
                  schedule: 2
                - startTime: '21:00'
                  endTime: 08:00
                  waveType: 2
                  schedule: 1
      responses:
        '200':
          description: Envelope response. Non-zero `code` values (401 wrong token, 403 missing token or token param) are returned
            inside the envelope with HTTP 200.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiEnvelope'
        '404':
          description: Unknown path.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/NotFoundError'
  /api-common/queryTouProfile:
    get:
      tags:
      - System Settings
      summary: Query TOU Profile
      operationId: queryTouProfile
      description: Query energy TOU profile
      parameters:
      - name: deviceId
        in: query
        required: true
        schema:
          type: string
        description: Device id
      responses:
        '200':
          description: Envelope response. Non-zero `code` values (401 wrong token, 403 missing token or token param) are returned
            inside the envelope with HTTP 200.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiEnvelope'
        '404':
          description: Unknown path.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/NotFoundError'
  /api-common/setSwitchParam:
    post:
      tags:
      - System Settings
      summary: Set aPower Switch
      operationId: setSwitchParam
      description: Set aPower Switch
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                deviceId:
                  type: string
                  description: Device id
                cmd:
                  type: integer
                  description: 'Type. 1 : Start up, 2 : Shut down'
              required:
              - deviceId
              - cmd
      responses:
        '200':
          description: Envelope response. Non-zero `code` values (401 wrong token, 403 missing token or token param) are returned
            inside the envelope with HTTP 200.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiEnvelope'
        '404':
          description: Unknown path.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/NotFoundError'
  /api-common/queryApowerSwitchStatus:
    get:
      tags:
      - System Settings
      summary: Query aPower Switch Status
      operationId: queryApowerSwitchStatus
      description: Query aPower Switch Status
      parameters:
      - name: deviceId
        in: query
        required: true
        schema:
          type: string
        description: Device id
      responses:
        '200':
          description: Envelope response. Non-zero `code` values (401 wrong token, 403 missing token or token param) are returned
            inside the envelope with HTTP 200.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiEnvelope'
        '404':
          description: Unknown path.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/NotFoundError'
  /api-common/setSmartCircuits:
    post:
      tags:
      - System Settings
      summary: Set Smart Circuits
      operationId: setSmartCircuits
      description: Set smart circuits
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                deviceId:
                  type: string
                  description: Device id
                swMerge:
                  type: integer
                  description: 'Circuits Merge. 0: Separated 1 : Merged If set to 1, It represents the merging of circuit
                    1 and circuit 2, and all the value set by sw2 will be invalid'
                sw1Name:
                  type: string
                  description: Circuit 1 naming
                sw1MsgType:
                  type: inte

# --- truncated at 32 KB (58 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/franklin-whole-home/refs/heads/main/openapi/franklin-whole-home-openapi.yml