Luxor PlatformAPI DocumentationCommanderReporting

Get reports

Returns historical Commander reporting data as rows: the same figures as the Reports page and its CSV download. With group_by=time (the default) it returns a timeseries, one row per tick_size bucket; other group_by values return one row per combination of the requested breakdowns. A missing value is null, never 0. Requires a Commander Pro subscription (403 otherwise). **Measures and compatible group_by values** | Measure | Unit | Allowed group_by | | --- | --- | --- | | hashrate | H/s (Sol/s for equihash) | time, site, model, firmware, subaccount, client_id, miner_id | | power_consumption | W | time, site, model, firmware, subaccount, client_id, miner_id | | efficiency | J/TH | time, site, model, firmware, subaccount, client_id, miner_id | | temperature | °C | time, site, model, firmware, subaccount, client_id, miner_id | | energy_consumption | kWh | time, site, model, firmware, subaccount, client_id, miner_id | | site_load | 0–1 ratio | time, site | | online_miners | mean concurrent count | time, site, model, firmware, subaccount, client_id | | hashing_miners | mean concurrent count | time, site, model, firmware, subaccount, client_id | | failing_miners | mean concurrent count | time, site, model, firmware, subaccount, client_id | | new_miners | count | time, site, model, firmware, client_id | | new_errors | count | time, site, model, firmware, client_id | | unresolved_errors | count | time, site, model, firmware, client_id | | bulk_actions | count | time, site | | triggers_executed | count | time, site | | iminer_optimizations | count | time, site | | tickets_opened | count | time, site | | tickets_closed | count | time, site | **Rules** - miner_id can only be combined with time and/or site, and requires a period of 31 days or less. - efficiency is sha256 only. - tick_size is required when group_by includes time. - At most 5000 time buckets per request: 1h covers about 208 days, 1d covers about 13.7 years. - start_date must be before today (UTC), and end_date is clamped to the start of today: reports only cover complete days. - At most 100,000 rows in total. Narrow the period, the breakdowns or site_ids if you hit this. A request that breaks any rule, or names an unknown parameter or value, is rejected with 400 listing the violations found. A malformed or missing parameter is reported first, before the rules that combine parameters are checked. **Examples** Daily fleet timeseries: GET /v2/commander/reports?start_date=2026-09-01&end_date=2026-09-28&measures=hashrate,power_consumption,hashing_miners&group_by=time&tick_size=1d Energy by site by month: GET /v2/commander/reports?start_date=2026-01-01&end_date=2026-06-30&measures=energy_consumption&group_by=time,site&tick_size=1M Per-miner hashrate over a week: GET /v2/commander/reports?site_ids=618ee7c5-bf5d-45b8-b845-b423cf5123d0&start_date=2026-09-21&end_date=2026-09-27&measures=hashrate,temperature&group_by=miner_id Action counts by site: GET /v2/commander/reports?start_date=2026-09-01&end_date=2026-09-28&measures=bulk_actions,triggers_executed,iminer_optimizations&group_by=site

GET
/v2/commander/reports

Authorization

LuxorAPIKey
authorization<token>

Use your API key here.

In: header

Query Parameters

site_ids?string

Comma-separated site UUIDs. Omit to report on every site in the workspace.

start_date*string

First day of the period (YYYY-MM-DD, UTC, inclusive). Must be before today: reports only cover complete days.

Formatdate
end_date*string

Last day of the period (YYYY-MM-DD, UTC, inclusive). Clamped to the start of today (UTC): the current, partial day is never returned.

Formatdate
measures*string

Comma-separated measures, at least one. hashrate: Mean hashrate in H/s (Sol/s for equihash); power_consumption: Mean power consumption in watts; efficiency: Mean efficiency in J/TH, sha256 only; temperature: Mean temperature in °C; energy_consumption: Energy consumed in kWh; site_load: Mean power consumption as a ratio of the site's configured max load (0–1); online_miners: Mean number of concurrently online miners; hashing_miners: Mean number of concurrently hashing miners; failing_miners: Mean number of concurrently failing miners; new_miners: Number of newly discovered miners; new_errors: Number of new errors; unresolved_errors: Number of unresolved errors; bulk_actions: Number of bulk actions executed; triggers_executed: Number of automation rule executions; iminer_optimizations: Number of Intelligent Miner optimizations; tickets_opened: Number of tickets opened; tickets_closed: Number of tickets closed. See the endpoint description for which group_by values each measure allows.

group_by?string

Comma-separated breakdowns. time: One row per tick_size bucket (date_time); site: Per site (site_id); model: Per miner model (model); firmware: Per firmware (firmware); subaccount: Per pool subaccount (subaccount); client_id: Per client ID (client_id); miner_id: Per miner (miner_id). miner_id only combines with time and site, and needs a period of 31 days or less.

Default"time"
tick_size?string

Bucket size of the time breakdown; required when group_by includes time, ignored otherwise. At most 5000 buckets per request.

Value in

  • "1h"
  • "1d"
  • "1w"
  • "1M"
algorithm?string

Hashing algorithm whose hashrate, efficiency, miner counts, errors, actions and tickets the report reads; sha256 covers every miner that is not Equihash. Power, energy, temperature and site load are whole-fleet regardless.

Default"sha256"

Value in

  • "sha256"
  • "equihash"
page_number?integer

Page to return, starting at 1.

Range1 <= value <= 100000
Default1
page_size?integer

Rows per page. Defaults to 1000, at most 5000.

Range1 <= value <= 5000
Default1000

Response Body

application/json

application/json

application/json

application/json

curl -X GET "https://example.com/v2/commander/reports?start_date=2026-09-01&end_date=2026-09-28&measures=hashrate%2Cenergy_consumption"
{  "start_date": "2026-09-01",  "end_date": "2026-09-28",  "tick_size": "1d",  "algorithm": "sha256",  "group_by": [    "time",    "site"  ],  "measures": [    "hashrate",    "energy_consumption"  ],  "actions_truncated": false,  "rows": [    {      "date_time": "2026-09-01T00:00:00.000Z",      "site_id": "618ee7c5-bf5d-45b8-b845-b423cf5123d0",      "miner_id": "10011156160260362486",      "model": "Antminer S21",      "firmware": "luxos",      "subaccount": "my_subaccount",      "client_id": "client-a",      "hashrate": 110000000000000,      "power_consumption": 62613,      "efficiency": 20.3,      "temperature": 51.6,      "energy_consumption": 1532.5,      "site_load": 0.65,      "online_miners": 23,      "hashing_miners": 22.5,      "failing_miners": 2,      "new_miners": 0,      "new_errors": 6,      "unresolved_errors": 7,      "bulk_actions": 5,      "triggers_executed": 0,      "iminer_optimizations": 58,      "tickets_opened": 1,      "tickets_closed": 0    }  ],  "pagination": {    "page_number": 1,    "page_size": 1,    "item_count": 0,    "previous_page_url": null,    "next_page_url": null  }}
{  "statusCode": 400,  "code": "FST_ERR_VALIDATION",  "error": "Bad Request",  "message": "body/end_date Required"}
{  "statusCode": 403,  "code": "7",  "error": "Forbidden",  "message": "[permission_denied] site_id does not belong to this workspace"}
{  "statusCode": 503,  "code": "UNAVAILABLE",  "error": "Service Unavailable",  "message": "Something went wrong. Share this error code with support for assistance: 4bf92f3577b34da6a3ce929d0e0e4736"}