Every API here is available over the APIs.io API and to AI agents over MCP.
MCP server
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
Tools for apis
7 MCP tools reach this
find_apisBrowse and filter every API in the catalog.
get_api_artifactsOne API's artifacts, grouped by type.
get_openapiThe primary OpenAPI for this API.
find_similar_apisAPIs that look like this one.
apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
resolveTurn a domain, URL or GitHub org into the provider it belongs to.
find_cohortsEvery scored population of providers in the catalog.
All 92 tools →
Call it yourself
curl for this page
This API
curl "https://apis.io/api/v1/apis/enphase-device-level-monitoring-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"
Discovery needs no key. Ratings and market analysis are Pro.
Get an API key
Free tier, no email required.
A second provider on the same verified email joins the account you already have.
openapi: 3.2.0
info:
title: Device Level Monitoring API
version: v4
servers:
- url: https://api-qa2.enphaseenergy.com
tags:
- name: Device Level Monitoring
paths:
/api/v4/systems/{system_id}/devices/micros/telemetry:
get:
summary: Retrieves telemetry for all micros/PCUs in a system.
description: 'Retrieves paginated telemetry for all micro-inverters (PCUs) in a system.
If no start_at is specified, defaults to midnight today, in the timezone of the system. If the start_at specified is earlier than the system''s first reported date, then midnight of the system''s first reported date is considered as start_at.
The end_at is calculated as the minimum of the time of the request and (start time + granularity).
The meaning of granularity is as follows:
If granularity is 15mins, maximum 3 intervals will appear in response per device. If granularity is day, maximum 288 intervals will appear in response per device where each interval is of 5 mins duration.
The requested start date must be within 2 years from current date.
By default start_at will appear in response. If start_date parameter is passed in the url, then start_date field will appear in response.
By default end_at will appear in response. If end_date parameter is passed in the url then end_date field will appear in response.
Page size is limited to a maximum of 20.
Empty list will be returned if the site last reported interval < requested start time < current time.'
parameters:
- name: system_id
in: path
description: System id
required: true
schema:
type: integer
- name: page
in: query
description: Page number. Defaults to 1.
required: false
schema:
type: integer
- name: size
in: query
description: Number of devices per page. Defaults to 10. Maximum is 20.
required: false
schema:
type: integer
- name: start_at
in: query
description: Start time for fetching the telemetry data in Epoch time format. Alternatively one can use start_date in place of start_at for passing the start date as String in YYYY-MM-DD format. By default start_at will appear in response. If start_date parameter is passed in the url, then start_date field will appear in response.
schema:
type: integer
- name: end_at
in: query
description: End time for fetching the telemetry data in Epoch time format. Alternatively one can use end_date in place of end_at for passing the end date as String in YYYY-MM-DD format. By default end_at will appear in response. If end_date parameter is passed in the url, then end_date field will appear in response.
schema:
type: integer
- name: start_date
in: query
description: Start date for fetching the telemetry data in YYYY-MM-DD format. If passed, start_date will appear in response instead of start_at.
schema:
type: string
- name: end_date
in: query
description: End date for fetching the telemetry data in YYYY-MM-DD format. If passed, end_date will appear in response instead of end_at.
schema:
type: string
- name: granularity
in: query
description: The granularity of the telemetry data. Possible values are 'week', 'day', '15mins', '5mins'. Default is 'day'.
schema:
type: string
enum:
- 5mins
- 15mins
- day
- week
tags:
- Device Level Monitoring
responses:
'200':
description: Telemetry for all micros in the system
content:
application/json:
schema:
type: object
properties:
system_id:
type: integer
description: The unique numeric ID of the system
total_devices:
type: integer
description: Total number of micro-inverters in the system across all pages
page:
type: integer
description: Current page number
page_size:
type: integer
description: Number of devices returned in this page
start_at:
type: integer
description: Start time of the data series in Epoch format. Either start_at or start_date will be present depending on the request parameter used.
end_at:
type: integer
description: End time of the data series in Epoch format. Either end_at or end_date will be present depending on the request parameter used.
start_date:
type: string
description: Start date of the data series in YYYY-MM-DD format. Present only if start_date was passed as a request parameter.
end_date:
type: string
description: End date of the data series in YYYY-MM-DD format. Present only if end_date was passed as a request parameter.
granularity:
type: string
description: The granularity of the telemetry data. Possible values are 'week', 'day', '15mins', '5mins'. Default is 'day'.
items:
type: string
description: The list key, always 'intervals'
devices:
type: array
description: List of micro-inverter telemetry objects for this page
items:
type: object
properties:
serial_number:
type: string
description: Serial number of the micro-inverter
intervals:
type: array
description: List of telemetry intervals for this device
items:
type: object
properties:
end_at:
type: integer
description: End time of the telemetry interval in Epoch format
powr:
type: integer
description: Average power produced by this micro-inverter during this interval, measured in Watts
enwh:
type: integer
description: Energy produced by this micro-inverter during this interval, measured in Watt-Hours
example:
system_id: 1765
total_devices: 25
page: 1
page_size: 10
start_at: 1496526300
end_at: 1496529300
granularity: day
items: intervals
devices:
- serial_number: '123456789012'
intervals:
- end_at: 1496526300
powr: 30
enwh: 40
- end_at: 1496526600
powr: 20
enwh: 40
- serial_number: '123456789013'
intervals:
- end_at: 1496526300
powr: 25
enwh: 35
- end_at: 1496526600
powr: 18
enwh: 30
'401':
description: Authentication Error
content:
application/json:
schema:
type: object
properties:
message:
type: string
description: Error Type
details:
type: string
description: Error Details
code:
type: integer
description: Error Code
example:
message: Not Authorized
details: User is not authorized
code: 401
'403':
description: Forbidden
content:
application/json:
schema:
type: object
properties:
message:
type: string
description: Error Type
details:
type: string
description: Error Details
code:
type: integer
description: Error Code
example:
message: Forbidden
details: Not authorized to access this resource
code: 403
'404':
description: Not Found
content:
application/json:
schema:
type: object
properties:
message:
type: string
description: Error Type
details:
type: string
description: Error Details
code:
type: integer
description: Error Code
example:
message: Not Found
details: System not found for {:id=>"1"}
code: 404
'405':
description: Method Not Allowed
content:
application/json:
schema:
type: object
properties:
reason:
type: string
message:
type: array
items:
type: string
example:
reason: '405'
message:
- Method not allowed
'422':
description: Unprocessable Entity
content:
application/json:
schema:
type: object
properties:
message:
type: string
description: Error Type
details:
type: string
description: Error Details
code:
type: integer
description: Error Code
example:
message: Unprocessable Entity
details: Invalid request because of 'Requested date is in the future'
code: 422
'429':
description: Too Many Requests
content:
application/json:
schema:
type: object
properties:
message:
type: string
description: Error Type
details:
type: string
description: Error Details
code:
type: integer
description: Error Code
period:
type: string
description: Quota exceeded for minute/month
period_start:
type: integer
description: Starting period timestamp
period_end:
type: integer
description: Ending period timestamp
limit:
type: integer
description: Limit count for the period
example:
message: Too Many Requests
details: Usage limit exceeded for plan Kilowatt
code: 429
'501':
description: Not Implemented
content:
application/json:
schema:
type: object
properties:
reason:
type: string
message:
type: array
items:
type: string
example:
reason: '501'
message:
- Not Implemented
/api/v4/systems/{system_id}/devices/micros/{serial_no}/telemetry:
get:
summary: Retrieves telemetry for single micro/pcu.
description: "Retrieves telemetry for single micro/pcu. \nIf no start_at is specified, defaults to midnight today, in the timezone of the system. If the start_at specified is earlier than the system’s first reported date, then midnight of the system’s first reported date is considered as start_at.\nThe end_at is calculated as the minimum of the time of the request and (start time + granularity). \nThe meaning of granularity is as follow:\n\nIf granularity is 15mins, maximum 3 intervals will appear in response. If granularity is day, maximum 288 intervals will appear in response where each interval is of 5 mins duration.\n \n The requested start date must be within 2 years from current date. \n By default start_at will appear in response. If start_date parameter is passed in the url, then start_date field will appear in response. \nBy default end_at will appear in response. If end_date parameter is passed in the url then end_date field will appear in response. Empty list will be returned if the last interval < requested start time < current time."
parameters:
- name: system_id
in: path
description: System id
required: true
schema:
type: integer
- name: serial_no
in: path
description: Serial Number of the individual solar Microinverter
required: true
schema:
type: string
- name: start_at
in: query
description: Start time for fetching the telemetry data in Epoch time format. Alternatively one can use start_date in place of start_at for passing the start date as String in YYYY-MM-DD format. By default start_at will appear in response. If start_date parameter is passed in the url, then start_date field will appear in response.
schema:
type: integer
- name: granularity
in: query
description: The granularity of the telemetry data. Possible values are 'week', 'day', '15mins', '5mins'. Default is 'day'
schema:
type: string
enum:
- 5mins
- 15mins
- day
- week
tags:
- Device Level Monitoring
responses:
'200':
description: Telemetry for micro
content:
application/json:
schema:
type: object
properties:
system_id:
type: integer
description: The unique numeric ID of the system
serial_number:
type: string
description: The device serial number
granularity:
type: string
description: The granularity of the telemetry data. Possible values are 'week', 'day', '15mins', '5mins'. Default is 'day'
total_devices:
type: integer
description: Shall always be 1 since this is telemetry from individual micros
start_at:
type: integer
description: Start Time of the data series. Either Start_date or start_at will be present. By default start_at will appear in response. If start_date parameter passed in the url then start_date field will appear in response.
end_at:
type: integer
description: End Time of the data series. Either end_date or end_at will be present. By default end_at will appear in response. If end_date parameter passed in the url then end_date field will appear in response.
items:
type: string
description: The list key 'intervals'
intervals:
type: array
items:
properties:
end_at:
type: integer
description: End time of the telemetry interval
powr:
type: integer
description: Average power (in Watt) produced by all the microinverters during this interval, measured in Watts.
enwh:
type: integer
description: Energy produced (in Watt-Hours) from all the microinverters combined during that period
example:
system_id: 1765
serial_number: '12345'
granularity: day
total_devices: 1
start_at: 1496526300
end_at: 1496529300
items: intervals
intervals:
- end_at: 1496526300
powr: 30
enwh: 40
- end_at: 1496526600
powr: 20
enwh: 40
'401':
description: Authentication Error
content:
application/json:
schema:
type: object
properties:
message:
type: string
description: Error Type
details:
type: string
description: Error Details
code:
type: integer
description: Error Code
example:
message: Not Authorized
details: User is not authorized
code: 401
'403':
description: Forbidden
content:
application/json:
schema:
type: object
properties:
message:
type: string
description: Error Type
details:
type: string
description: Error Details
code:
type: integer
description: Error Code
example:
message: Forbidden
details: Not authorized to access this resource
code: 403
'404':
description: Not Found
content:
application/json:
schema:
type: object
properties:
message:
type: string
description: Error Type
details:
type: string
description: Error Details
code:
type: integer
description: Error Code
example:
message: Not Found
details: Micro not found for {:id=>"1"}
code: 404
'405':
description: Method Not Allowed
content:
application/json:
schema:
type: object
properties:
reason:
type: string
message:
type: array
items:
type: string
example:
reason: '405'
message:
- Method not allowed
'422':
description: Unprocessable Entity
content:
application/json:
schema:
type: object
properties:
message:
type: string
description: Error Type
details:
type: string
description: Error Details
code:
type: integer
description: Error Code
example:
message: Unprocessable Entity
details: Invalid request because of 'Requested date range is invalid for this system. {:start_at=>1566930600, :end_at=>1565333100, :first_interval=>1565072100, :last_interval=>1565333700}'
code: 422
'429':
description: Too Many Requests
content:
application/json:
schema:
type: object
properties:
message:
type: string
description: Error Type
details:
type: string
description: Error Details
code:
type: integer
description: Error Code
period:
type: string
description: Quota exceeded for minute/month
period_start:
type: integer
description: Starting period timestamp
period_end:
type: integer
description: Ending period timestamp
limit:
type: integer
description: Limit count for the period
example:
message: Too Many Requests
details: Usage limit exceeded for plan Kilowatt
code: 429
period: minute
period_start: 1623825660
period_end: 1623825720
limit: 5
'501':
description: Not Implemented
content:
application/json:
schema:
type: object
properties:
reason:
type: string
message:
type: array
items:
type: string
example:
reason: '501'
message:
- Not Implemented
/api/v4/systems/{system_id}/devices/encharges/{serial_no}/telemetry:
get:
summary: Retrieves telemetry for single Encharge
description: "Retrieves telemetry for single Encharge. \nIf no start_at is specified, defaults to midnight today, in the timezone of the system. If the start_at specified is earlier than the system’s first reported date, then midnight of the system’s first reported date is considered as start_at.\nThe end_at is calculated as the minimum of the time of the request and (start time + granularity). \nThe meaning of granularity is as follow:\n\nIf granularity is 15mins, maximum 1 interval will appear in response. If granularity is day, maximum 96 intervals, and if granularity is week, maximum 672 intervals, will appear in response where each interval is of 15 mins duration.\n \n The requested start date must be within 2 years from current date. \n By default start_at will appear in response. If start_date parameter is passed in the url, then start_date field will appear in response. \nBy default end_at will appear in response. If end_date parameter is passed in the url then end_date field will appear in response. Empty list will be returned if the last interval < requested start time < current time."
parameters:
- name: system_id
in: path
description: System id
required: true
schema:
type: integer
- name: serial_no
in: path
description: Serial Number of the encharge
required: true
schema:
type: string
- name: start_at
in: query
description: Start time for fetching the telemetry data in Epoch time format. Alternatively one can use start_date in place of start_at for passing the start date as String in YYYY-MM-DD format. By default start_at will appear in response. If start_date parameter is passed in the url, then start_date field will appear in response.
schema:
type: integer
- name: granularity
in: query
description: The granularity of the telemetry data. Possible values are 'week', 'day', '15mins', '5mins'. Default is 'day'
schema:
type: string
enum:
- 5mins
- 15mins
- day
- week
tags:
- Device Level Monitoring
responses:
'200':
description: Telemetry for the Encharge
content:
application/json:
schema:
type: object
properties:
system_id:
type: integer
description: System id
serial_number:
type: string
description: The device serial number
granularity:
type: string
description: The granularity of the telemetry data. Possible values are 'week', 'day', '15mins', '5mins'. Default is 'day'
total_devices:
type: integer
description: Shall always be 1 since this is telemetry from individual micros
start_at:
type: integer
description: Start Time of the data series. Either Start_date or start_at will be present. By default start_at will appear in response. If start_date parameter passed in the url then start_date field will appear in response.
end_at:
type: integer
description: End Time of the data series. Either end_date or end_at will be present. By default end_at will appear in response. If end_date parameter passed in the url then end_date field will appear in response.
items:
type: string
description: The list key 'intervals'
intervals:
type: array
items:
properties:
end_at:
type: integer
description: End time of the telemetry interval.
charge:
type: object
properties:
enwh:
type: integer
description: Energy into the battery during the interval
discharge:
type: object
properties:
enwh:
type: integer
description: Energy discharged from the battery during the interval
soc:
type: object
properties:
percent:
type: integer
description: Battery soc percentage
last_reported_time:
type: integer
description: Last reported timestamp
last_reported_soc:
type: string
description: Last reported soc percentage
example:
system_id: 1765
serial_number: '12345'
granularity: day
total_devices: 1
start_at: 1496526300
end_at: 1496529300
items: intervals
intervals:
- end_at: 1384122700
charge:
enwh: 40
discharge:
enwh: 0
soc:
percent: 25
last_reported_time: 1650349170
last_reported_soc: 99%
'401':
description: Authentication Error
content:
application/json:
schema:
type: object
properties:
message:
type: string
description: Error Type
details:
type: string
description: Error Details
code:
type: integer
description: Error Code
example:
message: Not Authorized
details: User is not authorized
code: 401
'403':
description: Forbidden
content:
application/json:
schema:
type: object
properties:
message:
type: string
description: Error Type
details:
type: string
description: Error Details
code:
type: integer
description: Error Code
example:
message: Forbidden
details: Not authorized to access this resource
code: 403
'404':
description: Not Found
content:
application/json:
schema:
type: object
properties:
message:
type: string
description: Error Type
details:
type: string
description: Error Details
code:
type: integer
description: Error Code
example:
message: Not Found
details: Encharge not found for {:id=>"1"}
code: 404
'405':
description: Method Not Allowed
content:
application/json:
schema:
type: object
properties:
reason:
type: string
message:
type: array
items:
type: string
example:
reason: '405'
message:
- Method not allowed
'422':
description: Unprocessable Entity
content:
application/json:
schema:
type: object
properties:
message:
type: string
description: Error Type
details:
type: string
description: Error Details
code:
type: integer
description: Error Code
example:
message: Unprocessable Entity
details: Invalid request because of 'Requested date range is invalid for this system. {:start_at=>1566930600, :end_at=>1565333100, :first_interval=>1565072100, :last_interval=>1565333700}'
code: 422
'429':
description: Too Many Requests
content:
application/json:
schema:
type: object
properties:
message:
type: string
description: Error Type
details:
type: string
description: Error Details
code:
type: integer
description: Error Code
period:
type: string
description: Quota exceeded for minute/month
period_start:
type: integer
description: Starting period timestamp
period_end:
type: integer
description: Ending period timestamp
limit:
type: integer
description: Limit count for the period
example:
message: Too Many Requests
details: Usage limit exceeded for plan Kilowatt
code: 429
period: minute
period_start: 1623825660
period_end: 1623825720
limit: 5
'501':
description: Not Implemented
content:
application/json:
schema:
type: object
# --- truncated at 32 KB (65 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/enphase/refs/heads/main/openapi/enphase-device-level-monitoring-api-openapi.yml