Provenance
Provenance API
Attest where a request comes from and keep a tamper-evident record of it.
Create an attestation
Parameters
- ipstringRequired
End-user IP to attest.
- claimed_jurisdictionstring
Jurisdiction the request claims, such as us-ut, uk, au or eu.
- request_contextobject
Any JSON object, stored with the attestation.
Response fields
- network_originstring
residential_clean, mobile, hosting, datacenter, vpn, residential_proxy, tor, relay or unknown.
- anonymizedboolean
True when the network hides the person behind it. Hosting counts, except known infrastructure.
- methodstring
Which signal decided the verdict.
- confidencenumber
Confidence from 0 to 1.
- policy_actionstring
allow, step_up or block under the claimed jurisdiction.
- attestation_idinteger
Id of the sealed attestation.
curl -X POST https://ipscanner.io/v1/provenance/check \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"ip": "203.0.113.24",
"claimed_jurisdiction": "us-ut",
"request_context": {
"gate": "age-verification"
}
}'{
"network_origin": "vpn",
"anonymized": true,
"method": "ip_state:vpn",
"confidence": 0.9,
"policy_action": "block",
"attestation_id": 80421
}Verify the chain
Response fields
- okboolean
True when every entry hash and link checks out.
- countinteger
Entries checked.
- brokenAtinteger
Id of the first altered entry, or 0 when the chain is intact.
curl https://ipscanner.io/v1/provenance/verify \
-H "Authorization: Bearer YOUR_API_KEY"{
"ok": true,
"count": 80421,
"brokenAt": 0
}Verify against the daily anchor
Response fields
- okboolean
True when every entry hash and link checks out.
- countinteger
Entries checked.
- brokenAtinteger
Id of the first altered entry, or 0 when the chain is intact.
- yoursinteger
How many of the entries are yours.
- anchorobject | null
Most recent daily root hash, or null before the first one.
- atstring
When the verification ran.
curl -X POST https://ipscanner.io/v1/provenance/verify \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{}'{
"ok": true,
"count": 80421,
"brokenAt": 0,
"yours": 1204,
"anchor": {
"day": "2026-10-05",
"rootHash": "9f2c4e1a7b0d3c58e6f1a2b4c7d9e0f3a5b8c1d4e7f0a3b6c9d2e5f8a1b4c7d0",
"lastId": 80390
},
"at": "2026-10-06T14:05:00Z"
}Read the chain
Parameters
- limitintegerquery
Page size, 50 by default and 200 at most.
- beforeintegerquery
Return entries older than this id, for paging.
Response fields
- linksarray
Chain entries, newest first.
- links[].entryHashstring
Hash of this entry.
- links[].prevHashstring
Hash of the entry before it.
- links[].linkOkboolean
True when this entry links to the one before it.
- nextBeforeinteger
Pass as before for the next page; 0 means there is none.
- totalinteger
Attestations on your account.
- summaryobject
Count of attestations per policy action.
curl "https://ipscanner.io/v1/provenance/chain?limit=1" \
-H "Authorization: Bearer YOUR_API_KEY"{
"links": [
{
"id": 80421,
"ts": "2026-10-06T14:02:11Z",
"ip": "203.0.113.24",
"claimedJurisdiction": "us-ut",
"networkOrigin": "vpn",
"anonymized": true,
"method": "ip_state:vpn",
"confidence": 0.9,
"policyAction": "block",
"entryHash": "b41f0c9e2d7a6358c1e4f7a0b3d6c9e2f5a8b1c4d7e0f3a6b9c2d5e8f1a4b7c0",
"prevHash": "7e3a9c1f5b2d8e4a6c0f3b7d1e5a9c2f6b0d4e8a2c6f0b4d8e2a6c0f4b8d2e6a",
"prevId": 80420,
"entryOk": true,
"linkOk": true
}
],
"nextBefore": 80421,
"total": 1204,
"summary": {
"allow": 1090,
"step_up": 71,
"block": 43
},
"anchor": null,
"jurisdictions": [],
"asOf": "2026-10-06T14:05:00Z"
}List jurisdictions
Response fields
- jurisdictions[].codestring
Code to send as claimed_jurisdiction.
- jurisdictions[].lawstring
The law the rule follows.
- jurisdictions[].strictboolean
True when a masked origin is refused outright.
- jurisdictions[].cleanActionstring
Action for a clean origin.
- jurisdictions[].maskedActionstring
Action for a masked origin.
curl https://ipscanner.io/v1/provenance/jurisdictions \
-H "Authorization: Bearer YOUR_API_KEY"{
"jurisdictions": [
{
"code": "us-ut",
"label": "Utah",
"law": "Utah SB 73",
"strict": true,
"cleanAction": "allow",
"maskedAction": "block",
"rule": "Age-gated access requires a verified in-state location. A masked origin is refused outright."
},
{
"code": "eu",
"label": "European Union",
"law": "DSA minor protection",
"strict": false,
"cleanAction": "allow",
"maskedAction": "step_up",
"rule": "A masked origin is sent for stronger checks rather than refused, so travellers and privacy tools are not locked out."
}
]
}Export evidence
Parameters
- fromstringquery
Start of the range, as YYYY-MM-DD or RFC 3339.
- tostringquery
End of the range, as YYYY-MM-DD or RFC 3339.
curl "https://ipscanner.io/v1/provenance/export?from=2026-10-01&to=2026-10-31" \
-H "Authorization: Bearer YOUR_API_KEY"# provenance evidence export
# range,2026-10-01,2026-10-31
# chain_verified,true,count,80421
id,ts,ip,claimed_jurisdiction,network_origin,anonymized,method,confidence,policy_action,entry_hash
80421,2026-10-06T14:02:11Z,203.0.113.24,us-ut,vpn,true,ip_state:vpn,0.9000,block,b41f0c9e2d7a...