Quickstart

First forecast in 30 minutes

Build a working dispatch schedule with an API token, 7 days of feeder readings, and about 30 minutes.

Step by step

Complete walkthrough

Follow each request and expected response. Replace ezp_live_<token> with your Bearer token in every request.

01

Verify your credentials

After provisioning, you receive a Bearer token and assigned feeder IDs. Test the token before sending metering data.

curl -s \
  -H "Authorization: Bearer ezp_live_<token>" \
  https://api.ezaphq.com/v1/feeders

{
  "feeders": [
    {
      "feeder_id": "feeder-pt-0042",
      "name": "Porto Norte substation A",
      "status": "no_data",
      "last_reading_ts": null
    }
  ]
}

A 401 means the token is invalid or inactive. Contact [email protected].

02

Prepare metering data

The ingest endpoint accepts 15-minute interval aggregates. Create the JSON payload for your first feeder. Use at least 7 days; 14-30 days improves model quality.

{
  "feeder_id": "feeder-pt-0042",
  "interval_minutes": 15,
  "readings": [
    { "ts": "2026-07-14T00:00:00Z", "mw": 14.7 },
    { "ts": "2026-07-14T00:15:00Z", "mw": 13.9 },
    { "ts": "2026-07-14T00:30:00Z", "mw": 13.5 },
    { "ts": "2026-07-14T00:45:00Z", "mw": 12.8 }
  ]
}

Use UTC ISO 8601 timestamps. Gaps of one or two intervals are tolerated. Gaps over 2 hours trigger a data quality warning on the next request.

03

Push data

Send readings to the ingest endpoint. Requests support up to 5 MB, or about 2880 readings for 30 days. For larger uploads, use the batch CSV path in the integration guide.

curl -s -X POST \
  -H "Authorization: Bearer ezp_live_<token>" \
  -H "Content-Type: application/json" \
  -d @readings.json \
  https://api.ezaphq.com/v1/ingest/metering

{
  "status": "accepted",
  "feeder_id": "feeder-pt-0042",
  "readings_ingested": 2016,
  "coverage_start": "2026-07-14T00:00:00Z",
  "coverage_end": "2026-07-21T00:00:00Z",
  "model_status": "training"
}

New feeder training typically takes 3-8 minutes, depending on history length. Check feeder status before requesting a forecast.

04

Wait for ready, then request a forecast

Poll feeder status until model_status changes to ready. Then request a 24-hour forecast with P10, P50, and P90 bands at 15-minute resolution.

curl -s \
  -H "Authorization: Bearer ezp_live_<token>" \
  "https://api.ezaphq.com/v1/forecast/feeder-pt-0042?horizon=24h"

{
  "feeder_id": "feeder-pt-0042",
  "horizon_hours": 24,
  "generated_at": "2026-07-21T06:00:00Z",
  "model_mape_trailing_7d": 3.8,
  "intervals": [
    {
      "ts": "2026-07-21T06:00:00Z",
      "p10_mw": 12.1,
      "p50_mw": 14.8,
      "p90_mw": 17.2
    },
    {
      "ts": "2026-07-21T06:15:00Z",
      "p10_mw": 11.9,
      "p50_mw": 14.5,
      "p90_mw": 16.8
    }
  ]
}

model_mape_trailing_7d is Mean Absolute Percentage Error for back-tested predictions over the last 7 days. Below 5% is typical with clean 15-minute data.

05

Get the dispatch schedule

The dispatch schedule is derived from the P50 forecast and covers 24 hours. Use it to plan reserve procurement.

curl -s \
  -H "Authorization: Bearer ezp_live_<token>" \
  https://api.ezaphq.com/v1/dispatch-schedule/feeder-pt-0042

{
  "feeder_id": "feeder-pt-0042",
  "schedule_date": "2026-07-21",
  "generated_at": "2026-07-21T06:01:00Z",
  "schedule": [
    {
      "ts": "2026-07-21T06:00:00Z",
      "committed_mw": 14.8,
      "reserve_band_mw": 2.7,
      "action": "hold"
    },
    {
      "ts": "2026-07-21T07:00:00Z",
      "committed_mw": 17.3,
      "reserve_band_mw": 3.1,
      "action": "ramp_up"
    }
  ]
}

reserve_band_mw is the P90-P10 spread for that interval. It gives operators one value for the required reserve margin.

What next

After your first forecast

Add more feeders

Repeat the ingest step for every feeder in your account. Pilot supports up to 3 feeders; Grid and Regional remove that limit.

Review accuracy reports

After 7 days of live operation, call /v1/accuracy/{feeder_id} for MAPE, RMSE, and P50-vs-actual results. Use them to tune reserve buffer sizing.

Webhooks

Grid tier and above can configure a webhook endpoint to push forecast updates and significant deviation alerts to customer systems.