Provenance
API Reference
Provenance API
Location attestation and tamper-evident audit log.
Base URL
https://ipscanner.ioAuthenticate every request with Authorization: Bearer YOUR_API_KEY. Create a key in your account.
POST
/v1/provenance/checkCreate an attestation
Classifies the network origin of an IP, applies the jurisdiction policy, and seals a tamper-evident attestation. Call this server-side at your age or geo gate.
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
| ip | body | string | required | The end-user IP to attest (IPv4 or IPv6). |
| claimed_jurisdiction | body | string | optional | Region code the request claims to be in, e.g. us-ut, uk, eu. Drives the policy action. |
| request_context | body | object | optional | Free-form context stored with the attestation (e.g. which gate fired). |
Request body
{
"ip": "203.0.113.24",
"claimed_jurisdiction": "us-ut",
"request_context": {
"gate": "age-verification"
}
}Response
{
"network_origin": "vpn",
"anonymized": true,
"method": "ip_state:vpn",
"confidence": 0.9,
"policy_action": "block",
"attestation_id": 80421
}POST /v1/provenance/check
const apiKey = 'YOUR_API_KEY';
const res = await fetch('https://ipscanner.io/v1/provenance/check', {
method: 'POST',
headers: {
'Authorization': `Bearer ${apiKey}`,
'Content-Type': 'application/json'
},
body: JSON.stringify({
"ip": "203.0.113.24",
"claimed_jurisdiction": "us-ut",
"request_context": {
"gate": "age-verification"
}
})
});
const data = await res.json();
console.log(data);GET
/v1/provenance/verifyVerify the chain
Recomputes every entry hash in your audit log and confirms the chain is intact. brokenAt is the id of the first altered row, or 0 when the chain verifies.
Response
{
"ok": true,
"count": 80421,
"brokenAt": 0
}GET /v1/provenance/verify
const apiKey = 'YOUR_API_KEY';
const res = await fetch('https://ipscanner.io/v1/provenance/verify', {
method: 'GET',
headers: {
'Authorization': `Bearer ${apiKey}`,
'Content-Type': 'application/json'
}
});
const data = await res.json();
console.log(data);GET
/v1/provenance/exportExport evidence
Returns a signed-evidence CSV of your attestations for a date range, with a chain-verification header. Use it to demonstrate proportionate measures to a regulator.
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
| from | query | date | optional | Start date (YYYY-MM-DD or RFC3339). Defaults to the beginning. |
| to | query | date | optional | End date (YYYY-MM-DD or RFC3339). Defaults to now. |
Response
# provenance evidence export
# range,2026-01-01,2026-06-30
# chain_verified,true,count,80421
id,ts,ip,claimed_jurisdiction,network_origin,anonymized,method,confidence,policy_action,entry_hash
80421,2026-06-20T00:09:42Z,203.0.113.24,us-ut,vpn,true,ip_state:vpn,0.9000,block,9f2c...Responds with text/csv as an attachment, not JSON.
GET /v1/provenance/export
const apiKey = 'YOUR_API_KEY';
const res = await fetch('https://ipscanner.io/v1/provenance/export', {
method: 'GET',
headers: {
'Authorization': `Bearer ${apiKey}`,
'Content-Type': 'application/json'
}
});
const data = await res.json();
console.log(data);