Market data
OREE covers live DAM prices and indexes.
Developer API · Alvo platform
Connect Alvo to internal portals, BI, partner products, or trader workflows. V1 prepares verifiable calculations, explanations, risk reports, and audit trails, but it does not submit market orders without the responsible trader.
Integration layers
OREE covers live DAM prices and indexes.
Strategy, BESS, and backtest endpoints share the same PricePoint model.
Risk reports, audit events, API key mode, and rate limits for a controlled launch.
Security model
ALVO_REQUIRE_API_KEY=true moves endpoints into key-protected mode. The key is accepted through x-alvo-api-key or Authorization: Bearer. Product API responses include no-store, X-Alvo-API-Version, and the security mode header; anonymous status and OpenAPI metadata intentionally omit it. During the free beta the public deployment does not require a key: public data is open, compute-heavy features run on your signed-in session, and self-serve API keys are not offered yet.
Workflow
GET /api/oree/prices, /api/oree/indexes, and your own CSV/import layer.
POST /api/strategy/plan and POST /api/bess/plan.
POST /api/risk/report before export or approval.
POST /api/audit/events for key actions.
POST /api/notifications/subscriptions for PWA channels without automatic order submission.
Intelligence layer
The same deterministic analytics the workspace runs, exposed to machines: an MCP tool-server for external assistants and a sovereignty receipt attesting that generation happened with zero data egress. All read-only and honest about the price-only forecast ceiling.
POST /api/mcpGET /api/mcpAn external GPT or Claude reads Alvo's deterministic signals (day-ahead prices, forecast, cross-border regime) and cited methodology over the Model Context Protocol — JSON-RPC 2.0 over HTTP. Read-only: no tool mutates anything or places an order. Every result carries a deterministic provenance marker (model alvo-rules-v1, dataSentToExternalModel:false).
Available tools
get_day_ahead_pricesHourly Ukraine DAM/IDM price book (UAH/MWh) for a month.get_forecastProbabilistic forecast: p10/p50/p90 bands, optional capHitProbability, and model skill (rMAE, null when the backtest scored no day).get_regime_snapshotCross-border scarcity regime: scarce / balanced / surplus, UA–EU basis, flow direction.cite_methodologyCited grounding from the Alvo docs corpus: forecast validation, AI sovereignty and tool guardrails.curl -X POST "$ALVO_URL/api/mcp" \
-H "content-type: application/json" \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/list"
}'POST /api/ai/receipt/verifyEvery AI brief and export can carry a sovereignty receipt — a structured record that generation was deterministic, used no external model, and sent no data off-platform (0 external tokens, $0). The receipt embeds a recomputable hash of the declared inputs, so anyone can verify it independently through the open endpoint.
What the receipt attests
Backtest on the frozen Energy Map archive: Alvo's deterministic clearing engine re-derived the actual day-ahead clearing price and cleared volume from published bid/ask curves across low and high price regimes, including cap-binding hours. This validates the clearing core, not a live forecast, forward forecast, or automatic trading action.
docs/research/market-model-studio-validation.mdDisclosure under Article 50 of the EU AI Act (EU AI Act Article 50).
Endpoints
/api/healthPublic customer-service state, aggregated data freshness, active incident, and version without internal configuration.
/api/oree/pricesMonthly DAM or IDM price book from public Market Operator data.
/api/oree/indexesBase, Peak, OffPeak, min, max, and weighted-average DAM prices by date.
/api/forecastMonthly probabilistic forecast: hourly p10/p50/p90 bands, optional capHitProbability for DAM cap-hit risk, the served model, and its skill (rMAE vs the seasonal-naive benchmark).
/api/strategy/planRecommended buy/sell hours, expected result, spreads, volume, and fees.
/api/bess/planCharge/discharge cycles, profit with efficiency, degradation, and equivalent cycles.
/api/backtest/summaryA historical run of the DAM strategy and BESS over the supplied prices under your assumptions: per-day results and daily rows. It checks history; it is not a forecast of future results.
/api/risk/reportData coverage, anomalies, exposure, BESS cycles, and guardrails before trader approval.
/api/ai/trading-briefLocalized deterministic brief for the trader in Ukrainian or English.
/api/narrator/toolsService-token guarded list of available AiNarrator tools with input schemas. Describes tools only - no external model and no trading action.
/api/narrator/tools/{name}Service-token guarded call for one tool using its schema. Invalid input or an unknown tool returns ok:false instead of a raw exception.
/api/audit/eventsTyped prices_loaded, csv_imported, ai_brief_generated, and plan_exported events for the action log. HTTP 201 with persisted:true confirms a platform write. HTTP 202 returns persisted:false and durability:"local-only": a local UUID/timestamp receipt with no confirmation of platform persistence. There is no queue or automatic retry. reason: no-platform — API base URL missing, request not sent; rejected — response outside 2xx, persistence unknown; unparseable — 2xx response without a valid write echo with an event id, persistence unknown; timeout — 1500 ms abort or another transport exception, persistence unknown.
/api/audit/eventsTenant-scoped list of recent events (audit.read role only when RBAC is enforced). Supports limit and before cursor for pagination.
/api/coupling/flowsHourly MW flows for a UA border (default UA↔PL): leg.fromTo, leg.toFrom, netFlowMw. Live from ENTSO-E A11; fixture when token absent.
/api/multi-zone/pricesPersisted exact-date day-ahead prices for PL, SK, HU, RO, DE, CZ, AT, HR, BG, GR, LT, LV, EE, PT, BE, FR, NL and ES — V2 in EUR/MWh, only for CC-BY-licensed zones. These are daily display values; they do not widen hourly basis, FTR or forecast coverage. The payload carries its provider, dataset, licence and attribution. For 404, reason explains why no prices are servable: no_rows — no stored rows for the date, cause unknown; no_rows_in_captured_artifact — the latest recorded completed attempt inspected an archived Ember file with no usable prices for the date, including blank cells; no_complete_revision_group — no complete group from one revision; no_displayable_zone — no requested zone passed public-display validation. This does not establish the publisher's current release state; a missing attempt record does not prove that no attempt occurred. Legacy 404 responses may omit reason — do not infer a cause. For 503, reason is: database_reads_disabled — database reads disabled; database_not_configured — database not configured; database_query_failed — database read failed; missing_api_base — API address not configured; invalid_payload — API response violates the contract or requested date; platform_unavailable — API unreachable or no recognized failure cause supplied. Invalid query parameters return 400 without reason. Raw ENTSO-E A44 (exchange-owned) is never redistributed.
/api/system-operationsHourly UA load + generation mix (nuclear / coal / gas / hydro / wind / solar). Live from ENTSO-E A65 + A75; fixture when UA TSO doesn't publish (today).
/api/regimeDeterministic headline signal: the regime (scarce/balanced/surplus), the derived UA↔EU basis (EUR/MWh) + its level, and the coupling flow direction. Derived basis only — never a raw exchange A44/NEMO price. A present-state read, not a forecast. The same signal as the MCP tool get_regime_snapshot, over plain REST.
/api/market-model/market-depthService-token guarded read over stored order-book snapshots: walk-the-book slippage, depth, and execution risk by size. Display over supplied ladders - not a forecast, order recommendation, or fill guarantee.
/api/account/api-keysMint a tenant-scoped API key for programmatic access. Plaintext is returned exactly once — save it. Requires api.manage role (owner). Keys are not offered as a self-serve feature during the free beta.
/api/account/api-keysActive API keys for the tenant (without plaintext): name, prefix, lastUsedAt, createdAt.
/api/account/api-keys/{id}Soft-revoke a key (writes revokedAt + actorId). Revoked keys cannot be restored — issue a new one.
/api/notifications/subscriptionsWeb Push contract for price updates, risk alerts, BESS windows, and export readiness without trading action.
curl -X POST "$ALVO_URL/api/risk/report" \
-H "content-type: application/json" \
-H "x-alvo-api-key: $ALVO_API_KEY" \
-d '{
"tradeDate": "13.05.2026",
"prices": [
{ "hour": 0, "priceUahMwh": 5575 },
{ "hour": 1, "priceUahMwh": 5100 },
{ "hour": 2, "priceUahMwh": 100 },
{ "hour": 3, "priceUahMwh": 70 },
{ "hour": 4, "priceUahMwh": 100 },
{ "hour": 5, "priceUahMwh": 4800 },
{ "hour": 6, "priceUahMwh": 5880 },
{ "hour": 7, "priceUahMwh": 5267 },
{ "hour": 8, "priceUahMwh": 3878 },
{ "hour": 9, "priceUahMwh": 3050 },
{ "hour": 10, "priceUahMwh": 49 },
{ "hour": 11, "priceUahMwh": 10 },
{ "hour": 12, "priceUahMwh": 11 },
{ "hour": 13, "priceUahMwh": 11 },
{ "hour": 14, "priceUahMwh": 10 },
{ "hour": 15, "priceUahMwh": 12 },
{ "hour": 16, "priceUahMwh": 110 },
{ "hour": 17, "priceUahMwh": 1900 },
{ "hour": 18, "priceUahMwh": 6200 },
{ "hour": 19, "priceUahMwh": 7400 },
{ "hour": 20, "priceUahMwh": 6900 },
{ "hour": 21, "priceUahMwh": 6100 },
{ "hour": 22, "priceUahMwh": 5400 },
{ "hour": 23, "priceUahMwh": 4800 }
],
"strategySettings": {
"volumeMwh": 5,
"minSpreadUah": 250,
"maxTradesPerDay": 4,
"feeUahPerMwh": 12
},
"bessSettings": {
"capacityMwh": 10,
"powerMw": 5,
"roundTripEfficiency": 0.9,
"maxCyclesPerDay": 2,
"degradationCostUahMwh": 80
},
"sourceLabel": "oree.com.ua",
"isFallbackData": false
}'{
"tradeDate": "13.05.2026",
"generatedAt": "2026-05-13T09:12:04.318Z",
"bessDegradationUnavailableReason": null,
"tradingFeeUnavailableReason": null,
"dataProvenanceUnavailableReason": null,
"report": {
"overallStatus": "needsReview",
"score": 84,
"reviewCount": 2,
"blockCount": 0
}
}
// The three markers above are null because the request stated the fee, the wear rate and the
// price provenance. Omit a key and its marker returns "not-supplied", while the dataSource check
// still answers "pass". Read the marker, not the status. report.checks is abridged — full shape
// in the OpenAPI schema.Use the workspace to verify logic manually, then use OpenAPI JSON for SDKs, Postman, contract tests, or partner integrations.