API / reference
Shapes and conventions.
The live endpoint list is on the API page, reported by the service itself. This page covers what the responses look like.
Money is always a string
Every token amount is an integer in base units, serialised as a decimal string, on a field whose name ends in BaseUnits.
A JSON number is an IEEE-754 double. One PRECRIME at 18 decimals is 1018 base units, which already exceeds what a double holds exactly, so a number would silently round someone’s stake in transit. Parse these with a big-integer type, not parseFloat.
{
"guiltyBaseUnits": "60000000000000000000000",
"innocentBaseUnits": "40000000000000000000000",
"grossPoolBaseUnits": "100000000000000000000000",
"guiltyImpliedBps": 6000,
"innocentImpliedBps": 4000
}Probabilities are basis points, also integers. 6000 is 60.00%.
A case
{
"id": "a1b2c3",
"title": "Supply concentration before unlock",
"caseType": "SUPPLY_TELEPORT",
"status": "ACTIVE",
"chainId": 4663,
"poolAddress": "0x…",
"target": {
"address": "0x…",
"tokenAddress": "0x…"
},
"rule": {
"hash": "0x…",
"condition": "Wallet 0xB095…ec29 transfers at least 14% …",
"meaning": "A GUILTY verdict means only that this exact event …",
"source": "Settled from finalised on-chain data only. …"
},
"fee": {
"feeBps": 200,
"treasuryBps": 95,
"creatorBps": 35,
"burnBps": 30,
"reserveBps": 20,
"referralBps": 20
},
"lockerRebateBps": 25,
"timeline": {
"openedAt": "2026-09-08T12:00:00.000Z",
"stakeCutoffAt": "2026-09-09T12:00:00.000Z",
"claimsOpenAt": null
},
"verdict": null
}fee is the split the case’s own pool was built with, in basis points of the gross pool: 200 in all by default, of which the creator is owed 35. lockerRebateBps, beside it, is what a PRECRIME locker’s winning stake is given back out of the treasury’s share.
rule.hash is the keccak256 the pool contract was constructed with. Recompute it from the canonical rule JSON and you can prove the contract settles against the rule that was published. The dossier endpoint also returns ruleVerified, which is that check performed server-side.
A verdict with final: false is provisional and can still be overturned. Do not present it as settled.
Pagination
List endpoints take limit and return nextCursor. Pass it back as cursor for the next page. A null cursor means the end.
Cursors are opaque and positional, not offsets. Do not construct one.
Errors
| Code | Status | Means |
|---|---|---|
| INVALID_REQUEST | 400 | The body or query failed validation. |
| UNAUTHORIZED | 401 | No credential, or one that is expired or revoked. |
| FORBIDDEN | 403 | The credential is missing a scope. The response names which. |
| NOT_FOUND | 404 | No such record, or one you may not read. |
| BODY_TOO_LARGE | 413 | The body is over the limit, 1 MiB unless the endpoint states its own. It was not read. |
| UNSUPPORTED_MEDIA_TYPE | 415 | The body was not sent as application/json, the only type accepted. |
| QUOTA_EXCEEDED | 429 | The key's daily quota is spent. The reset time is included. |
| NOT_CONFIGURED | 503 | A provider this endpoint needs is not connected. |
| INTERNAL_ERROR | 500 | Something failed. Details are logged, never returned. |
Internal error details are never returned. They can name internal hosts, so they are logged instead.
Provenance
Endpoints that report figures include a source field saying where they came from. A response with NO_SETTLEMENTS_YET means the zeros are genuine, not missing data — a distinction worth carrying into whatever you build on top.