SPAN website screenshot

SPAN

SPAN is a San Francisco-based home energy technology company building smart electrical panels that replace traditional residential breaker boxes with a software-defined, controllable, and metered panel. SPAN Panel provides whole-home real-time power and energy metering, per-circuit monitoring and remote relay control, grid/islanding state management for whole-home backup with solar and energy storage, EV charging coordination via SPAN Drive, and a mobile app for energy management. As of the SPAN Panel firmware r202603 release (Q1 2026), SPAN exposes a public-beta on-premise SPAN API for software integrations between SPAN Panel and other devices on the home Local Area Network. The SPAN API is a real, documented HTTP + MQTT/Homie surface that runs directly on the panel — there is no cloud-hosted developer endpoint. The REST surface provides authentication, system status, Wi-Fi setup, panel state, per-circuit control, panel grid relay, energy storage state-of-energy, and emergency reconnect operations. The publish/subscribe surface uses the Electrification Bus (eBus) framework and Homie Convention over MQTT for streaming real-time panel state, per-circuit telemetry, and control of relays. SPAN API is licensed for personal, non-commercial use under MIT-0 for docs and example code; commercial / fleet use requires the separately licensed SPAN Fleet Manager.

2 APIs 16 Features
EnergyHome EnergyElectrificationSmart PanelElectrical PanelHome AutomationSolarEnergy StorageEV ChargingGridIslandingBackup PowerDemand ResponseIoTMQTTHomieElectrification BusOn-Premise

APIs

SPAN REST API

Local on-premise HTTP/JSON REST API hosted directly on SPAN Panel. The API exposes authentication (registering API clients and obtaining JWT access tokens), system status, Wi-Fi...

SPAN eBus MQTT API

Publish/subscribe streaming API hosted on SPAN Panel using the Electrification Bus (eBus) integration framework and the Homie Convention. SPAN Panel hosts an MQTT broker accessi...

Collections

Span

OPEN

Pricing Plans

Span Io Plans Pricing

3 plans

PLANS

Rate Limits

Span Io Rate Limits

0 limits

RATE LIMITS

FinOps

Features

SPAN Panel — software-defined smart electrical panel replacing traditional residential breaker boxes
Whole-home and per-circuit real-time power and energy metering
Per-circuit remote relay control with named circuits and priority groups
Grid / islanding state management for whole-home backup with solar and energy storage
SPAN Drive — integrated Level 2 EV charging coordinated with the panel
SPAN Home mobile and on-premise apps for energy management and monitoring
On-premise SPAN API hosted on the panel — REST + MQTT, LAN-only, no cloud
HTTP Bearer JWT authentication minted by the panel and bound to a named API client
REST resources for circuits, panel state, panel grid relay, panel meter and power, islanding state, energy storage SoE and nice-to-have thresholds, Wi-Fi scan/connect, system status, emergency reconnect
MQTT pub/sub via the Electrification Bus (eBus) framework using the Homie Convention
mDNS-advertised local discovery (`_span._tcp`, `_span-api._tcp`, `_mqtt._tcp`) for zero-config integration
JSON Schema for Homie device descriptions and mDNS service records
Reference shell + Python scripts (span-discover, span-auth, span-curl, span-mqtt-sub, span-mdns-query)
Public beta — initial firmware r202603 for SPAN Panel MAIN 32, rolling out to MAIN 16 / MLO 24 / MAIN 40 / MLO 48 in H2 2026
Commercial / fleet integrations served separately via SPAN Fleet Manager licensing
SPAN Utilities — distributed energy resource (DER) management platform for utility partners

Event Specifications

SPAN eBus MQTT API

Publish/subscribe streaming API hosted directly on SPAN Panel using the Electrification Bus (eBus) integration framework and the Homie Convention for MQTT topic and payload stru...

ASYNCAPI

Semantic Vocabularies

Span Context

18 classes · 5 properties

JSON-LD

API Governance Rules

SPAN API Rules

5 rules · 1 errors 4 warnings

SPECTRAL

Resources

🔗
Website
Website
🌐
Portal
Portal
🔗
Documentation
Documentation
🔗
Documentation
Documentation
🔗
Product
Product
🔗
Product
Product
🔗
Product
Product
🔗
Product
Product
🔗
Product
Product
📰
Blog
Blog
🔗
AnnouncementPost
AnnouncementPost
💬
Support
Support
📜
TermsOfService
TermsOfService
📜
PrivacyPolicy
PrivacyPolicy
👥
GitHubOrganization
GitHubOrganization
🔗
Repository
Repository
🔗
Forums
Forums
🔗
Issues
Issues
📄
ChangeLog
ChangeLog
🔗
License
License
📦
SDKs
SDKs
📦
SDKs
SDKs
📦
SDKs
SDKs
🔧
Tools
Tools
🔗
Twitter
Twitter
🔗
LinkedIn
LinkedIn
👥
YouTube
YouTube
🔗
Careers
Careers
🔗
Contact
Contact
🔗
Plans
Plans
🔗
RateLimits
RateLimits
🔗
FinOps
FinOps

Sources

Raw ↑
opencollection: 1.0.0
info:
  name: Span
  version: v1
items:
- info:
    name: Generate Jwt
    type: http
  http:
    method: POST
    url: '{{baseUrl}}/api/v1/auth/register'
    body:
      type: json
      data: '{}'
    auth:
      type: bearer
      token: '{{bearerToken}}'
  docs: Generate Jwt
- info:
    name: Get All Clients
    type: http
  http:
    method: GET
    url: '{{baseUrl}}/api/v1/auth/clients'
    auth:
      type: bearer
      token: '{{bearerToken}}'
  docs: Get All Clients
- info:
    name: Get Client
    type: http
  http:
    method: GET
    url: '{{baseUrl}}/api/v1/auth/clients/:name'
    params:
    - name: name
      value: ''
      type: path
    auth:
      type: bearer
      token: '{{bearerToken}}'
  docs: Get Client
- info:
    name: Delete Client
    type: http
  http:
    method: DELETE
    url: '{{baseUrl}}/api/v1/auth/clients/:name'
    params:
    - name: name
      value: ''
      type: path
    auth:
      type: bearer
      token: '{{bearerToken}}'
  docs: Delete Client
- info:
    name: System Status
    type: http
  http:
    method: GET
    url: '{{baseUrl}}/api/v1/status'
    auth:
      type: bearer
      token: '{{bearerToken}}'
  docs: System Status
- info:
    name: Get Wifi Scan
    type: http
  http:
    method: GET
    url: '{{baseUrl}}/api/v1/wifi/scan'
    auth:
      type: bearer
      token: '{{bearerToken}}'
  docs: Get Wifi Scan
- info:
    name: Run Wifi Connect
    type: http
  http:
    method: POST
    url: '{{baseUrl}}/api/v1/wifi/connect'
    body:
      type: json
      data: '{}'
    auth:
      type: bearer
      token: '{{bearerToken}}'
  docs: Run Wifi Connect
- info:
    name: Get Panel State
    type: http
  http:
    method: GET
    url: '{{baseUrl}}/api/v1/panel'
    auth:
      type: bearer
      token: '{{bearerToken}}'
  docs: Get Panel State
- info:
    name: Get Islanding State
    type: http
  http:
    method: GET
    url: '{{baseUrl}}/api/v1/islanding-state'
    auth:
      type: bearer
      token: '{{bearerToken}}'
  docs: Get Islanding State
- info:
    name: Get Main Relay State
    type: http
  http:
    method: GET
    url: '{{baseUrl}}/api/v1/panel/grid'
    auth:
      type: bearer
      token: '{{bearerToken}}'
  docs: Get Main Relay State
- info:
    name: Set Main Relay State
    type: http
  http:
    method: POST
    url: '{{baseUrl}}/api/v1/panel/grid'
    body:
      type: json
      data: '{}'
    auth:
      type: bearer
      token: '{{bearerToken}}'
  docs: Set Main Relay State
- info:
    name: Get Panel Power
    type: http
  http:
    method: GET
    url: '{{baseUrl}}/api/v1/panel/power'
    auth:
      type: bearer
      token: '{{bearerToken}}'
  docs: Get Panel Power
- info:
    name: Get Panel Meter
    type: http
  http:
    method: GET
    url: '{{baseUrl}}/api/v1/panel/meter'
    auth:
      type: bearer
      token: '{{bearerToken}}'
  docs: Get Panel Meter
- info:
    name: Get Circuits
    type: http
  http:
    method: GET
    url: '{{baseUrl}}/api/v1/circuits'
    auth:
      type: bearer
      token: '{{bearerToken}}'
  docs: Get Circuits
- info:
    name: Get Circuit State
    type: http
  http:
    method: GET
    url: '{{baseUrl}}/api/v1/circuits/:circuitId'
    params:
    - name: circuitId
      value: ''
      type: path
    auth:
      type: bearer
      token: '{{bearerToken}}'
  docs: Get Circuit State
- info:
    name: Set Circuit State
    type: http
  http:
    method: POST
    url: '{{baseUrl}}/api/v1/circuits/:circuitId'
    params:
    - name: circuitId
      value: ''
      type: path
    body:
      type: json
      data: '{}'
    auth:
      type: bearer
      token: '{{bearerToken}}'
  docs: Set Circuit State
- info:
    name: Deprecated Spaces Endpoint Stub
    type: http
  http:
    method: GET
    url: '{{baseUrl}}/api/v1/spaces/:spaces_id'
    params:
    - name: spaces_id
      value: ''
      type: path
    auth:
      type: bearer
      token: '{{bearerToken}}'
  docs: Deprecated Spaces Endpoint Stub
- info:
    name: Deprecated Spaces Endpoint Stub
    type: http
  http:
    method: POST
    url: '{{baseUrl}}/api/v1/spaces/:spaces_id'
    params:
    - name: spaces_id
      value: ''
      type: path
    auth:
      type: bearer
      token: '{{bearerToken}}'
  docs: Deprecated Spaces Endpoint Stub
- info:
    name: Deprecated Spaces Endpoint Stub
    type: http
  http:
    method: GET
    url: '{{baseUrl}}/api/v1/spaces'
    params:
    - name: spaces_id
      value: ''
      type: query
    auth:
      type: bearer
      token: '{{bearerToken}}'
  docs: Deprecated Spaces Endpoint Stub
- info:
    name: Run Panel Emergency Reconnect
    type: http
  http:
    method: POST
    url: '{{baseUrl}}/api/v1/panel/emergency-reconnect'
    auth:
      type: bearer
      token: '{{bearerToken}}'
  docs: Run Panel Emergency Reconnect
- info:
    name: Get Storage Soe
    type: http
  http:
    method: GET
    url: '{{baseUrl}}/api/v1/storage/soe'
    auth:
      type: bearer
      token: '{{bearerToken}}'
  docs: Get Storage Soe
- info:
    name: Set Storage Soe
    type: http
  http:
    method: POST
    url: '{{baseUrl}}/api/v1/storage/soe'
    body:
      type: json
      data: '{}'
    auth:
      type: bearer
      token: '{{bearerToken}}'
  docs: Set Storage Soe
- info:
    name: Get Storage Nice To Have Threshold
    type: http
  http:
    method: GET
    url: '{{baseUrl}}/api/v1/storage/nice-to-have-thresh'
    auth:
      type: bearer
      token: '{{bearerToken}}'
  docs: Get Storage Nice To Have Threshold
- info:
    name: Set Storage Nice To Have Threshold
    type: http
  http:
    method: POST
    url: '{{baseUrl}}/api/v1/storage/nice-to-have-thresh'
    body:
      type: json
      data: '{}'
    auth:
      type: bearer
      token: '{{bearerToken}}'
  docs: Set Storage Nice To Have Threshold
bundled: true