Quickstart
This walks the entire loop against a live sandbox plant — a simulated 300 kW rooftop with eighteen months of history, a device that signs its readings, and monthly distributions already executed. Nothing here needs approval. Five steps, about ten minutes.
Sandbox access is arranged per partner rather than self-serve. Write to [email protected] and we will issue your keys.
01Get a key
Create an account and generate sandbox credentials in the console. No KYB, no review.
export ARK_ID=... export ARK_SECRET=... TOKEN=$(curl -s -X POST https://sandbox.api.arkreen.com/v1/auth/token \ -d 'grant_type=client_credentials' \ -d "client_id=$ARK_ID" -d "client_secret=$ARK_SECRET" | jq -r .access_token)
02Look at a plant
Every project exposes all three assurance dimensions, its history, and where it lives on-chain.
curl https://sandbox.api.arkreen.com/v1/projects/prj_sandbox_th01 \ -H "Authorization: Bearer $TOKEN"
{
"project_id": "prj_sandbox_th01",
"name": "Rooftop — Chonburi Industrial Park",
"data_assurance": "L3",
"asset_readiness": "investment_ready",
"assurance_state": "active",
"status": "operating",
"installed_capacity_w": 300000,
"lifetime_generation_wh": 700320000,
"performance_ratio": 0.841,
"chain_refs": { "chain": "polygon-amoy", "unit_token": { "token_id": "8442" } }
}L3 means device-signed telemetry corroborated by independent settlement evidence and periodic audit sampling. investment_ready means the documents were checked by someone licensed to check them and the money can physically move. Neither substitutes for the other.
→ Concepts / Assurance, readiness, and eligibility03Send a reading
Telemetry is a cumulative counter, monotonic within a meter_epoch. Carry meter_epoch and sequence_number on every reading so a legitimate counter reset can be told apart from tampering.
curl -X POST https://sandbox.api.arkreen.com/v1/telemetry:batch \
-H "Authorization: Bearer $TOKEN" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"device_id": "dev_sandbox_m3",
"readings": [{
"device_ts": "2026-08-22T09:00:00Z",
"energy_wh_cumulative": 4182339000,
"meter_epoch": 2,
"sequence_number": 88214,
"reading_id": "rdg_7wK2",
"reset_reason": null,
"measurement_quality": "good",
"active_power_w": 214300
}]
}'// 200 OK
{
"accepted": 1, "rejected": 0,
"batch_id": "tbx_01J9Z…",
"errors": [],
"verification": {
"signature": "valid",
"continuity": "ok",
"anomaly_score": 0.02,
"anomaly_status": "provisional"
},
"attestation": { "status": "pending", "expected_at": "2026-08-22T10:00:00Z" }
}Cumulative counters make total energy self-correcting after an outage. They do not recover the shape of the curve — which is what performance ratio, curtailment analysis, and month-boundary attribution all depend on. Backfill exists, and you should implement it.
04Follow the money back to the meters
Pull a distribution, then resolve its evidence_ref.
curl https://sandbox.api.arkreen.com/v1/distributions/dst_sandbox_4mB7xQ \ -H "Authorization: Bearer $TOKEN" curl https://sandbox.api.arkreen.com/v1/evidence/evd_sandbox_6Rk9wT \ -H "Authorization: Bearer $TOKEN"
Every payout resolves to four clusters of evidence: whether the electricity was produced, who owns the revenue, whether the money arrived, and how it was split. A perfect energy cluster tells you nothing about whether the offtaker paid — read them together or not at all.
05Subscribe to events
Register a webhook endpoint and stop polling.
curl -X POST https://sandbox.api.arkreen.com/v1/webhooks \
-H "Authorization: Bearer $TOKEN" \
-d '{
"url": "https://example.com/hooks/arkreen",
"events": ["distribution.executed", "assurance.provisionally_downgraded",
"assurance.restored", "telemetry.anomaly_detected"]
}'If you integrate one webhook, make it this one. It is the earliest signal available and it fires without anyone deciding to send it. Treat it as a signal, not a verdict — the partner has fourteen days to show the counter went backwards because a meter was replaced rather than tampered with, and assurance.restored is the other half of the story.