Skip to main content

Developer API · Alvo platform

API for DAM, BESS, and controlled decisions.

Connect Alvo to internal portals, BI, partner products, or trader workflows. V1 prepares verifiable calculations, explanations, risk reports, and audit trails. Alvo does not submit market orders.

OpenAPI 3.1free during the beta

Integration layers

One contract for data, decisions, risk, and audit.

Market data

OREE covers live DAM prices and indexes.

Decision engine

Strategy, BESS, and backtest endpoints share the same PricePoint model.

Control plane

Risk reports, audit events, API key mode, and rate limits for a controlled launch.

Security model

Market API data requires a free account session.

Price, index, cross-border flow, regional price, system-operations and regime routes require an active account session. Status and OpenAPI need no sign-in. For this beta, self-serve API keys are not offered yet; if your access requires an additional key and you were issued one, send it in x-alvo-api-key or Authorization: Bearer — it adds to the session, it does not replace it.

Secrets server-sideService keys stay on the server and never reach the browser.
Rate limitsThe API limits requests; above the limit it returns 429.
No automatic order submissionV1 does not submit market orders and requires trader approval.

Workflow

A typical integration follows five controlled steps.

01Load market data

After sign-in: GET /api/oree/prices, /api/oree/indexes, and your own CSV/import layer.

02Build plan

POST /api/strategy/plan and POST /api/bess/plan.

03Check risk

POST /api/risk/report before export or approval.

04Write audit

POST /api/audit/events for key actions.

05Connect signals

POST /api/notifications/subscriptions for PWA notifications.

Intelligence layer

Alvo signals in the workspace and account MCP endpoint.

The MCP endpoint gives an account the same deterministic signals as the workspace. External assistants need separate API provisioning; an API key alone cannot replace the account session today. Claims retain the price-only forecast ceiling. The sovereignty receipt attests that generation happened with zero data egress.

Model Context Protocol

MCP tool-server (read-only)

POST /api/mcpGET /api/mcp

JSON-RPC 2.0 over HTTP: day-ahead prices, forecast, cross-border regime and cited methodology. Results carry the alvo-rules-v1, dataSentToExternalModel:false provenance marker.

server
alvo-sovereignty
protocolVersion
2025-06-18

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.
tools/list in a signed-in browser
fetch("/api/mcp", {
  method: "POST",
  credentials: "same-origin",
  headers: { "content-type": "application/json" },
  body: JSON.stringify({ jsonrpc: "2.0", id: 1, method: "tools/list" })
}).then((response) => response.json())
EU AI Act Article 50

Sovereignty receipt (no-egress)

POST /api/ai/receipt/verify

Every 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

model
alvo-rules-v1
method
deterministic
dataSentToExternalModel
false
externalTokens
0
receiptVersion
alvo-no-egress-receipt-1
Where it appearsOn the trading brief (/api/ai/trading-brief) and in plan exports; verification is POST /api/ai/receipt/verify (no secrets, no auth).
Market Model Studio validation

504 historical DAM hours reconstructed exactly.

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.

  • 504 hours
  • 0 price/volume errors
  • 100% accuracy at price caps

Disclosure under Article 50 of the EU AI Act.

Endpoints

Documented web routes for accounts and future integrations.

GET/api/health
OperationsHealth check

Public customer-service state, aggregated data freshness, active incident, and version without internal configuration.

GET/api/oree/prices
Market dataOREE prices

Monthly DAM or IDM price book from public Market Operator data.

GET/api/oree/indexes
Market dataDAM indexes

Base, Peak, OffPeak, min, max, and weighted-average DAM prices by date.

GET/api/forecast
Market dataPrice forecast

Monthly 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).

POST/api/strategy/plan
StrategyDAM plan

Recommended buy/sell hours, expected result, spreads, volume, and fees.

POST/api/bess/plan
BESSBESS plan

Charge/discharge cycles, profit with efficiency, degradation, and equivalent cycles.

POST/api/backtest/summary
BacktestBacktest summary

A 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.

POST/api/risk/report
RiskRisk report

Data coverage, anomalies, exposure, BESS cycles, and guardrails.

POST/api/ai/trading-brief
AITrading brief

Localized deterministic brief for the trader in Ukrainian or English.

GET/api/narrator/tools
AIDeterministic tool registry

Service-token guarded inventory of available AiNarrator tools and their input schemas. Tool descriptions only, with no external model.

POST/api/narrator/tools/{name}
AIRun a deterministic tool

Service-token guarded call for one tool using its schema. Invalid input or an unknown tool returns ok:false instead of a raw exception.

POST/api/audit/events
AuditAudit event

Typed 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.

GET/api/audit/events
AuditTenant event log

Recent events of your session's own tenant only, newest first (audit.read role only when RBAC is enforced). Supports limit and before cursor for pagination. Served only when the deployment resolves the session to its own tenant (the external identity mode). In the public-demo and api-key modes the route refuses before any read: 503 with reason audit_tenant_isolation_unavailable and no events, never a shared list. A platform read that fails or is refused is 503 with reason audit_read_unavailable.

GET/api/coupling/flows
ENTSO-ECross-border flows

Hourly MW flows for a UA border (default UA↔PL): leg.fromTo, leg.toFrom, netFlowMw. Live from ENTSO-E A11; synthetic values when token absent.

GET/api/multi-zone/prices
CC BY V2Regional DAM prices

Persisted 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.

GET/api/system-operations
ENTSO-EUA power system

Hourly UA load and generation mix (ENTSO-E A65 + A75). ENTSO-E does not publish these series for Ukraine. When data is not null, it currently contains synthetic values marked as a fallback — do not treat them as observed data. When data is missing or the read is unavailable, data is null. data.source: system-operations-fixture; data.freshness.status: fallback

GET/api/regime
AlvoCross-border scarcity regime

Deterministic 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.

GET/api/market-model/market-depth
Market ModelMarket depth / execution risk

Service-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.

POST/api/account/api-keys
SecurityCreate API key

Mint 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.

GET/api/account/api-keys
SecurityList API keys

Active API keys for the tenant (without plaintext): name, prefix, lastUsedAt, createdAt.

DELETE/api/account/api-keys/{id}
SecurityRevoke API key

Soft-revoke a key (writes revokedAt + actorId). Revoked keys cannot be restored — issue a new one.

POST/api/notifications/subscriptions
NotificationsPWA subscription

Web Push contract for price updates, risk alerts, BESS windows, and export readiness.

Risk report request
# Requires a cookie jar for an active session with alvo_session and alvo_user.
# If an additional key is required, add the issued x-alvo-api-key header.
curl -X POST "$ALVO_URL/api/risk/report" \
  -H "content-type: application/json" \
  --cookie "$ALVO_SESSION_COOKIE_JAR" \
  -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
  }'
Guardrail response
{
  "tradeDate": "13.05.2026",
  "generatedAt": "2026-05-13T09:12:04.318Z",
  "bessDegradationUnavailableReason": null,
  "tradingFeeUnavailableReason": null,
  "dataProvenanceUnavailableReason": null,
  "report": {
    "overallStatus": "needsReview",
    "score": 92,
    "reviewCount": 1,
    "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.

Need API access for an integration?

Self-serve API keys are not offered yet — email [email protected] with what you want to connect. Check the logic in the workspace and the contract in the OpenAPI JSON.