Overview / Quickstart
Copy page as MarkdownJoin the sandbox waitlist
EARLY ACCESS

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" } }
}
ℹ Two fields, two questions

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 eligibility

03Send 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 do not recover the curve

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"]
  }'
✓ Subscribe to assurance.provisionally_downgraded

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.

Connect a real plantGuides / Connect a plant via inverter cloud →
Go to productionGet certified as a partner →
Understand the modelConcepts / The fact chain →