Axonn Energy API

Real-time European & US energy market data, trading signals, and AI-powered monitoring — built for power traders, battery operators, and energy developers.

Base URL: https://axonnpower.com

Quick Start

Get your first API response in 30 seconds.

1. Get your API key

Sign up at axonnpower.com — your key is generated automatically on first login.

2. Make your first call

cURL
Python
JavaScript
curl -H "X-API-Key: YOUR_KEY" \
  https://app.axonnpower.com/v1/prices/DE
import httpx

client = httpx.Client(
    base_url="https://axonnpower.com",
    headers={"X-API-Key": "YOUR_KEY"},
)

# Day-ahead prices for Germany
prices = client.get("/v1/prices/DE").json()
print(f"Avg price: {prices['data']['stats']['avg']:.2f} EUR/MWh")

# Full snapshot — prices, generation, weather, signal
snapshot = client.get("/v1/snapshot/DE").json()

# Trading signal with conviction
signal = client.get("/v1/signal/DE").json()
print(f"Signal: {signal['data']['direction']} ({signal['data']['conviction']:.0%})")
const BASE = "https://axonnpower.com";
const KEY = "YOUR_KEY";

const res = await fetch(`${BASE}/v1/prices/DE`, {
  headers: { "X-API-Key": KEY },
});
const { data } = await res.json();
console.log(`Avg price: ${data.stats.avg.toFixed(2)} EUR/MWh`);

3. Response format

{
  "ok": true,
  "country": "DE",
  "source": "epex_prices",
  "updated_at": "2026-03-06T10:30:00Z",
  "data": {
    "prices": [{ "hour": 0, "eur_mwh": 42.5 }, ...],
    "stats": { "avg": 55.3, "peak": 89.1, "trough": 12.4, ... }
  }
}

Authentication

Pass your API key via the X-API-Key header on every request.

X-API-Key: axn_abc123...

Alternatively, if using the web dashboard, requests use a Bearer JWT token from Supabase. Both are accepted on all /v1/* endpoints.

Public endpoints (no auth): /v1/status, /v1/health, /v1/meta, /status

Errors & Envelope

All responses follow the same envelope:

// Success
{ "ok": true, "data": { ... } }

// Error
{ "ok": false, "error": "Invalid country code" }

HTTP status codes: 200 success, 401 missing/invalid key, 403 tier limit, 404 not found, 429 rate limited, 500 server error.

Rate Limits & Tiers

TierReq/minDailyCustom TargetsExportBacktest
Free1005003--
Pro1,00010,00020CSV/JSONHistorical
EnterpriseUnlimited1MUnlimitedAllAll

Rate limit headers: X-RateLimit-Remaining, X-RateLimit-Reset

Market Data

Supported EU countries: DE FR NL AT NO CH ES IT BE DK SE FI PL

GET /v1/prices/{country}
Day-ahead electricity prices from EPEX. Hourly EUR/MWh with stats (avg, peak, trough, negative hours).
ParamTypeDescription
countrypathISO country code (DE, FR, etc.)
datequeryOptional. YYYY-MM-DD (default: today)
GET /v1/generation/{country}
Generation mix by source — solar, wind, nuclear, gas, hydro, etc.
GET /v1/load/{country}
Load forecast and actual load from ENTSO-E.
GET /v1/weather/{country}
Weather forecast — temperature, wind speed, solar irradiance.
GET /v1/flows/{country}
Cross-border physical power flows.
GET /v1/balancing/{country}
Intra-day balancing market prices (DE only).
GET /v1/outages/{country}
Plant outages from ENTSO-E transparency + REMIT.
ParamTypeDescription
active_onlyqueryBoolean, default true. Filter to active outages.
GET /v1/commodities
TTF natural gas and EUA carbon emission prices.
GET /v1/gas-storage/{country}
Gas storage fill levels from GIE AGSI+.
ParamTypeDescription
daysqueryHistory window in days (default: 30)
GET /v1/snapshot/{country}
All-in-one market snapshot — prices, generation, weather, signal, commodities in a single call.

US Markets

Supported ISOs: CAISO ERCOT PJM MISO NYISO ISONE SPP

GET /v1/us/prices/{iso}
Day-ahead LMP prices for US ISO/RTO.
GET /v1/us/snapshot/{iso}
Full US ISO snapshot — DA + RT prices, load, stats. ERCOT includes settlement point hubs and ancillary services.
ParamTypeDescription
isopathCAISO, ERCOT, PJM, MISO, NYISO, ISONE, SPP
zonequeryOptional. Settlement zone / pricing node
// Example: GET /v1/us/snapshot/ERCOT
{
  "ok": true,
  "data": {
    "iso": "ERCOT",
    "da_lmp": { "hourly": { "0": 23.74, "1": 21.50, ... } },
    "rt_lmp": { "hourly": { "0": 25.32, "1": 22.10, ... } },
    "stats": { "avg": 21.45, "peak": 32.04, "trough": 10.78, "spread": 21.26 },
    "load_mw": 53521.0,
    "settlement_points": {
      "HB_HOUSTON": { "da": { "0": 23.65, ... }, "rt": { "0": 27.38, ... } },
      "HB_NORTH":   { "da": { "0": 23.42, ... }, "rt": { "0": 24.25, ... } },
      "HB_SOUTH":   { "da": { "0": 22.58, ... }, "rt": { "0": 23.63, ... } },
      "HB_WEST":    { "da": { "0": 27.32, ... }, "rt": { "0": 30.53, ... } }
    },
    "ancillary_services": {
      "reg_up": 5.50, "reg_down": 3.30, "rrs": 2.10,
      "non_spin": 1.25, "ecrs": 0.80,
      "timestamp": "2026-03-11 08:00:00-0500"
    },
    "source_url": "https://www.ercot.com",
    "fetched_at": "2026-03-11T17:30:00+00:00"
  }
}

ERCOT-specific fields: settlement_points — DA + RT prices per hub (Houston, North, South, West). ancillary_services — real-time MCPC for Reg Up/Down, RRS, Non-Spin, ECRS. These fields are only present for ERCOT.

Trading Signals

GET /v1/signal/{country}
AI trading signal with conviction score — combines price spreads, renewable share, wind forecast, and market fundamentals.
ParamTypeDescription
datequeryOptional. YYYY-MM-DD
asset_typequeryOptional. "bess" or "v2g"
// Example response
{
  "ok": true,
  "data": {
    "direction": "BUY",
    "conviction": 0.78,
    "reason": "Wide peak-off-peak spread (42 EUR) + low wind forecast",
    "signals": ["spread_wide", "low_wind", "high_demand"],
    "spread_eur_mwh": 42.3,
    "renewable_share_pct": 38.5
  }
}
GET /v1/bess/revenue
Battery energy storage revenue estimation — day-ahead arbitrage + FCR.
ParamTypeDescription
countryqueryCountry code
asset_kwqueryBattery capacity in kW
fcr_pctqueryFCR allocation % (default: 0.3)
GET /v1/forecast/negative-hours/{country}
Forecast of negative price hours for tomorrow.
POST /v1/ask
Natural language question about energy markets — powered by LLM with live data context.
curl -X POST -H "X-API-Key: YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{"question": "Why did German prices spike today?"}' \
  https://app.axonnpower.com/v1/ask

Monitors

Create autonomous browser agents that monitor energy filing websites, extract structured data, and alert you on changes. Includes quality scoring, punishment for bad extractions, and self-healing agent memory.

GET /v1/monitors/prebuilt
List prebuilt monitor definitions — FERC, 7 US ISOs (CAISO, ERCOT, PJM...), EIA with pre-configured URLs, extraction prompts, and schemas.
POST /v1/monitors
Create a new monitor. Use prebuilt_source for one-click setup, or provide custom url + task_description + output_schema.
// Create from prebuilt
curl -X POST -H "X-API-Key: YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{"prebuilt_source": "ferc", "name": "FERC Filings"}' \
  https://app.axonnpower.com/v1/monitors

// Create custom
curl -X POST -H "X-API-Key: YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "ERCOT fuel mix",
    "url": "https://www.ercot.com/gridmktinfo/dashboards",
    "task_description": "Extract current fuel mix percentages",
    "output_schema": {"wind_pct": "number", "solar_pct": "number", "gas_pct": "number"},
    "interval_s": 300
  }' \
  https://app.axonnpower.com/v1/monitors
GET /v1/monitors
List all your monitors with status, quality scores, and last run time.
GET /v1/monitors/{id}/latest
Get the latest validated extraction — only updated when quality score passes threshold. Stale data is preserved on failure.
GET /v1/monitors/{id}/runs
Run history with quality scores, grades, duration, and error details.

Also available: PATCH /v1/monitors/{id}, DELETE /v1/monitors/{id}, GET /v1/monitors/{id}/changes, GET /v1/monitors/{id}/health, GET /v1/monitors/{id}/export, GET /v1/monitors/{id}/memory

Alerts & Streaming

POST /v1/alerts
Create an alert rule — get notified via webhook, email, or Slack when conditions are met.
curl -X POST -H "X-API-Key: YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "source": "prices",
    "country": "DE",
    "condition": "price_below",
    "threshold": 0,
    "channel": "webhook",
    "target": "https://your-server.com/hook"
  }' \
  https://app.axonnpower.com/v1/alerts
WS /v1/ws
Real-time change stream. Subscribe to sources and receive push updates as data changes.
const ws = new WebSocket("wss://app.axonnpower.com/v1/ws?api_key=YOUR_KEY");
ws.onopen = () => ws.send(JSON.stringify({ subscribe: ["prices:DE", "generation:FR"] }));
ws.onmessage = (e) => console.log(JSON.parse(e.data));
GET /v1/changes
Recent data changes across all sources — useful for polling if you can't use WebSockets.

Agent & Scraping

POST /v1/agent/browse
Run a headless browser agent on any URL — navigates, extracts, and returns structured data.
curl -X POST -H "X-API-Key: YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{"url": "https://www.eia.gov/electricity/", "task": "Extract latest generation stats"}' \
  https://app.axonnpower.com/v1/agent/browse
POST /v1/scrape
Scrape any URL to markdown with optional LLM extraction — Firecrawl-compatible interface.

Billing

Upgrade via Stripe checkout:

curl -X POST -H "X-API-Key: YOUR_KEY" \
  https://app.axonnpower.com/v1/billing/checkout

Manage subscription: POST /v1/billing/portal

Data Export

curl -H "X-API-Key: YOUR_KEY" \
  "https://app.axonnpower.com/v1/export/prices/DE?start_date=2026-01-01&end_date=2026-03-01&format=csv"

Formats: csv, json. Add &download=true for file download.

Historical Data

GET /v1/history/prices/{country}?limit=100&offset=0
GET /v1/history/generation/{country}
GET /v1/history/weather/{country}
GET /v1/history/commodities/{name}   # ttf_gas, eua_carbon

Need Help?

Interactive API explorer: /docs (Swagger UI) or /redoc (ReDoc)

Contact: founder@axonn-power.com