const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api-staging.keystoneos.xyz/v1/settlements/{settlement_id}/recovery', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api-staging.keystoneos.xyz/v1/settlements/{settlement_id}/recovery"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)curl --request GET \
--url https://api-staging.keystoneos.xyz/v1/settlements/{settlement_id}/recovery \
--header 'Authorization: Bearer <token>'{
"actor_meaning": "claimTimeout and claimRefund are accepted by the contract from the operator or from a wallet recorded as the depositor of a deposited leg of this settlement. Reading this report grants neither; owning or administering the settlement on KeyStone is not either actor. Every refund pays the leg's recorded depositor whoever submits the claim.",
"claim_submissions": "unknown",
"claim_submissions_meaning": "KeyStone keeps no record of claim requests or submissions and never submits one; whether a claim is in flight is unknown here. A claim that lands is observed as a status or refund change at a later block.",
"escrow": {
"chain_timeout_at": 1789556400,
"deadline_passed_at_block": true,
"deposited_count": 1,
"leg_count": 2,
"legs_match_record": true,
"observation": {
"block_hash": "0x5a5a...",
"block_number": 31337000,
"block_timestamp": 1789560000,
"chain_id": 84532,
"escrow_address": "0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512",
"meaning": "The contract's answer at this block, the latest the node served when asked. It is an observation, not finality: a later block can differ.",
"observed_at": "2026-09-16T12:00:00Z"
},
"raw_status": 1,
"status": "registered"
},
"evidence": "observed",
"funds": "held_in_escrow",
"generated_at": "2026-09-16T12:00:00Z",
"legs": [
{
"direction": "deliver",
"id": "6f1c2b3a-4d5e-6f70-8192-a3b4c5d6e7f8",
"leg_index": 0,
"observed": {
"amount": "1000",
"deposited": true,
"depositor": "0x1111111111111111111111111111111111111111",
"depositor_fees": "0",
"refund_total": "1000",
"refunded": false,
"token": "0x036CbD53842c5426634e7929541eC2318f3dCF7e"
},
"party_role": "seller",
"recorded_status": "locked"
}
],
"next_steps": [
{
"action": "claim_timeout",
"actor": "the contract operator or a wallet recorded as the depositor of a deposited leg",
"description": "Call claimTimeout(settlementId) on the escrow; the contract moves the settlement to TimedOut."
}
],
"recorded": {
"deadline_passed": true,
"escrow_chain_id": 84532,
"machine_version": "dvp/v1",
"state": "AWAITING_DEPOSITS",
"timeout_at": "2026-09-16T11:00:00Z"
},
"refund_claims": [],
"settlement_id": "550e8400-e29b-41d4-a716-446655440000",
"timeout_claim": {
"actor": "the contract operator or a wallet recorded as the depositor of a deposited leg",
"available": true,
"basis": "The escrow is Registered and the observed block is at or past timeoutAt.",
"method": "claimTimeout"
}
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>"
}
],
"code": "VALIDATION_ERROR",
"docs_url": "https://docs.keystoneos.xyz/guides/error-codes#validation-error"
}Get escrow recovery report
Requires the settlements:read scope (as an M2M scope or a user permission).
Report what KeyStone recorded for the settlement beside what the escrow contract reports at one block: status, the chain deadline, each leg’s deposit and refund flags, whether claimTimeout or claimRefund would be accepted at that block, and who the contract accepts those claims from. Evidence the deployment cannot obtain is reported as not_configured or unavailable, never resolved optimistically. Read-only: nothing is submitted, no state changes, and KeyStone keeps no record of claims others submit. Readable by the administering environment and every participant grant. Served with Cache-Control: private, no-store.
const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api-staging.keystoneos.xyz/v1/settlements/{settlement_id}/recovery', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api-staging.keystoneos.xyz/v1/settlements/{settlement_id}/recovery"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)curl --request GET \
--url https://api-staging.keystoneos.xyz/v1/settlements/{settlement_id}/recovery \
--header 'Authorization: Bearer <token>'{
"actor_meaning": "claimTimeout and claimRefund are accepted by the contract from the operator or from a wallet recorded as the depositor of a deposited leg of this settlement. Reading this report grants neither; owning or administering the settlement on KeyStone is not either actor. Every refund pays the leg's recorded depositor whoever submits the claim.",
"claim_submissions": "unknown",
"claim_submissions_meaning": "KeyStone keeps no record of claim requests or submissions and never submits one; whether a claim is in flight is unknown here. A claim that lands is observed as a status or refund change at a later block.",
"escrow": {
"chain_timeout_at": 1789556400,
"deadline_passed_at_block": true,
"deposited_count": 1,
"leg_count": 2,
"legs_match_record": true,
"observation": {
"block_hash": "0x5a5a...",
"block_number": 31337000,
"block_timestamp": 1789560000,
"chain_id": 84532,
"escrow_address": "0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512",
"meaning": "The contract's answer at this block, the latest the node served when asked. It is an observation, not finality: a later block can differ.",
"observed_at": "2026-09-16T12:00:00Z"
},
"raw_status": 1,
"status": "registered"
},
"evidence": "observed",
"funds": "held_in_escrow",
"generated_at": "2026-09-16T12:00:00Z",
"legs": [
{
"direction": "deliver",
"id": "6f1c2b3a-4d5e-6f70-8192-a3b4c5d6e7f8",
"leg_index": 0,
"observed": {
"amount": "1000",
"deposited": true,
"depositor": "0x1111111111111111111111111111111111111111",
"depositor_fees": "0",
"refund_total": "1000",
"refunded": false,
"token": "0x036CbD53842c5426634e7929541eC2318f3dCF7e"
},
"party_role": "seller",
"recorded_status": "locked"
}
],
"next_steps": [
{
"action": "claim_timeout",
"actor": "the contract operator or a wallet recorded as the depositor of a deposited leg",
"description": "Call claimTimeout(settlementId) on the escrow; the contract moves the settlement to TimedOut."
}
],
"recorded": {
"deadline_passed": true,
"escrow_chain_id": 84532,
"machine_version": "dvp/v1",
"state": "AWAITING_DEPOSITS",
"timeout_at": "2026-09-16T11:00:00Z"
},
"refund_claims": [],
"settlement_id": "550e8400-e29b-41d4-a716-446655440000",
"timeout_claim": {
"actor": "the contract operator or a wallet recorded as the depositor of a deposited leg",
"available": true,
"basis": "The escrow is Registered and the observed block is at or past timeoutAt.",
"method": "claimTimeout"
}
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>"
}
],
"code": "VALIDATION_ERROR",
"docs_url": "https://docs.keystoneos.xyz/guides/error-codes#validation-error"
}Authorizations
Auth0 JWT access token. See Authentication for details.
Path Parameters
Response
Successful Response
Show child attributes
Show child attributes
observed when the contract answered; not_configured when this deployment has no contract; unavailable when a declared contract could not be read.
observed, not_configured, unavailable Show child attributes
Show child attributes
KeyStone's legs in canonical order, each with the contract's view where observed.
Show child attributes
Show child attributes
Where the deposited funds stand as observed; unknown whenever the evidence does not establish it.
unknown, not_registered, none_deposited, held_in_escrow, paid_out, partially_refunded, refunded Show child attributes
Show child attributes
One per leg the contract reports deposited; nothing is refundable that was never deposited.
Show child attributes
Show child attributes
"unknown"Show child attributes
Show child attributes