Get the payee lock's evidence
/ api/ v1/ payee-lock/ evidenceEvery payout address change in a period, in the format vestiarion-payee-lock-evidence/1: who entered it, how it was checked and by whom, whether a second person stood behind it, what it held back, and the first payment to it, each fact citing the signed entries it rests on, which the document carries in full with the workspace's public keys. It is the file the evidence pack's Download signed JSON gives, with members named by user id, never by email.
Days are whole UTC days; leave out from or to for an open end. A day that does not read, or a from after to, answers 400, as does a period whose answer would be over 4 MB: ask for a shorter one. Text that came from outside, such as a payee's name, is carried as data.
Send a workspace API key as Authorization: Bearer ….
Parameters
fromstringoptionalThe first day, as
YYYY-MM-DD, in UTC. Leave it out to start from the first change.tostringoptionalThe last day, included, as
YYYY-MM-DD, in UTC. Leave it out to run to now.
Try it
The key is kept in memory only, for this page.
Code samples
curl "https://www.vestiarion.xyz/api/v1/payee-lock/evidence" \
-H "Authorization: Bearer $VESTIARION_API_KEY"Response
Example{
"data": {
"format": "vestiarion-payee-lock-evidence/1",
"exportedAt": "2026-10-25T09:00:00.000Z",
"workspace": {
"slug": "northstar-studio",
"name": "Northstar Studio"
},
"network": {
"id": "arc-testnet",
"label": "Arc testnet"
},
"period": {
"from": "2026-10-01",
"to": "2026-10-31"
},
"lock": {
"now": {
"on": true,
"coolingHours": 24
},
"changes": [
{
"at": "2026-10-01T08:00:00.000Z",
"by": {
"kind": "member",
"userId": "4b7e0c1a-2d3f-4e5a-8b6c-7d8e9f0a1b01",
"email": null
},
"from": {
"on": false,
"coolingHours": 0
},
"to": {
"on": true,
"coolingHours": 24
},
"entry": 5601
}
]
},
"summary": {
"changes": 1,
"confirmed": 1,
"confirmedWithRecord": 1,
"confirmedBySecondPerson": 1,
"heldWhileUnconfirmed": 0,
"heldForTheWait": 0,
"heldAsNewPayee": 0,
"paid": 1,
"paidOnlyAfterConfirmation": 1
},
"changes": [
{
"counterparty": {
"id": "7d1e4c2a-5b3f-4e8a-9c61-2f0a8b3d4c01",
"name": "Harbor Print Co."
},
"change": {
"at": "2026-10-02T09:00:00.000Z",
"from": "0x5a1b2c3d4e5f60718293a4b5c6d7e8f901234567",
"to": "0x8c4f2e1d0b9a87766554433221100ffeeddccbba",
"chain": "ARC-TESTNET",
"enteredBy": {
"kind": "member",
"userId": "4b7e0c1a-2d3f-4e5a-8b6c-7d8e9f0a1b01",
"email": null
},
"entry": 5605
},
"confirmation": {
"at": "2026-10-02T09:40:00.000Z",
"by": {
"kind": "member",
"userId": "4b7e0c1a-2d3f-4e5a-8b6c-7d8e9f0a1b02",
"email": null
},
"via": "confirm",
"record": {
"method": "call",
"methodLabel": "Called them on a number we had before",
"contact": "Harbor Print's accounts line, from the vendor file",
"contactOnFileBefore": true,
"note": "Read back the new address on the call."
},
"secondPerson": true,
"soloConfirmation": false,
"byGiver": false,
"giverUnknown": false,
"waitHours": 24,
"payableFrom": "2026-10-03T09:00:00.000Z",
"lookalikeOf": [],
"looksLikeEarlier": null,
"entry": 5606
},
"holds": [],
"firstPayment": {
"at": "2026-10-03T15:20:00.000Z",
"amount": 1250,
"currency": "USDC",
"txRef": "0x51713792df8660fed8ab6328e9b5023d1d80dcc566e5512abdcd7ef4eb1b92be",
"txUrl": "https://explorer.testnet.arc.io/tx/0x51713792df8660fed8ab6328e9b5023d1d80dcc566e5512abdcd7ef4eb1b92be",
"decidedBy": "person",
"subject": {
"kind": "invoice",
"id": "7d1e4c2a-5b3f-4e8a-9c61-2f0a8b3d4e51"
},
"entry": 5610
},
"checks": {
"recordKept": true,
"contactOnFileBefore": true,
"secondPerson": true,
"paidAfterConfirmation": true,
"paidAfterWait": true
}
}
],
"signedEntryProves": "A signed entry proves who recorded what, and when. It does not prove the goods were good or the work was done.",
"checkAnEntry": [
"body_hash = sha256(canonical JSON of { actor, domain, action, summary, detail }, keys sorted)",
"signature = Ed25519 over the 32 bytes of body_hash, by the key signing_key_id names",
"hash = sha256(prev_hash || body_hash || signature), the hex strings joined"
],
"keys": [
{
"id": "36e3209ae2e6a600",
"status": "active",
"publicKeyPem": "-----BEGIN PUBLIC KEY-----\nMCowBQYDK2VwAyEAhXbIpeLpKB5bbwxtRVDFBlWIDaY3sitQ9KiQ0xCR7No=\n-----END PUBLIC KEY-----\n"
}
],
"entries": [
{
"seq": 5601,
"id": "4c91f0f4-911a-4545-8288-0db0bc9e02b8",
"ts": "2026-10-01T08:00:00.000Z",
"actor": "human",
"domain": "system",
"action": "payee_lock_changed",
"summary": "Turned the payee lock on, with a 24-hour wait",
"detail": {
"by": "4b7e0c1a-2d3f-4e5a-8b6c-7d8e9f0a1b01",
"from": {
"on": false,
"coolingHours": 0
},
"to": {
"on": true,
"coolingHours": 24
}
},
"body_hash": "885a533140980dec04bcd50c470e75d411c28ce68a93c82faf03954b6ab8f368",
"signature": "12afb9acc4ac110589546ef7f2a8eb8df4312c8a72295159cdbd94be406abe8e737093639f9c52ca49e62ad298b9721b9968a3db9eda98df003a399f18c78b0c",
"prev_hash": "f930fef40d20e33527aea73c7a45b25da454cddb7ed988f4428566c590afd18a",
"hash": "e0060f2d92de74e98a2f37aa7fca828b96325cd810ea0f85b55e7367c6c900d9",
"signing_key_id": "36e3209ae2e6a600",
"check": {
"ok": true
}
},
{
"seq": 5605,
"id": "2ebe4be1-9898-4a8a-a182-166563617e2c",
"ts": "2026-10-02T09:00:00.000Z",
"actor": "human",
"domain": "compliance",
"action": "counterparty_address_changed",
"summary": "Changed Harbor Print Co.'s payout address",
"detail": {
"by": "4b7e0c1a-2d3f-4e5a-8b6c-7d8e9f0a1b01",
"counterpartyId": "7d1e4c2a-5b3f-4e8a-9c61-2f0a8b3d4c01",
"from": "0x5a1b2c3d4e5f60718293a4b5c6d7e8f901234567",
"to": "0x8c4f2e1d0b9a87766554433221100ffeeddccbba",
"chain": "ARC-TESTNET"
},
"body_hash": "32deece8f6598ac091688f95cc7650bf4b024509accc6c8bc08d02c24fbc7f8c",
"signature": "118fa4acab75d62884243ec3aa11a1069e3a3c8b7446d92b2b212515e89743e64bf7203888218494ca1576cf3f8346a2859853d060ce522881150f0f5b9dd505",
"prev_hash": "7890fd259c2a528efe9e2a57ff9b2d79385a4e7a684bcd2b12a1f93de96853d9",
"hash": "5a4e61f31d16b7c1c873867f7a2b4756deb63d9d2624a6892ef1340b3ed3ae89",
"signing_key_id": "36e3209ae2e6a600",
"check": {
"ok": true
}
},
{
"seq": 5606,
"id": "386d19ec-b651-485a-9fcc-6dc7f3979a15",
"ts": "2026-10-02T09:40:00.000Z",
"actor": "human",
"domain": "compliance",
"action": "counterparty_address_confirmed",
"summary": "Confirmed Harbor Print Co.'s new payout address",
"detail": {
"by": "4b7e0c1a-2d3f-4e5a-8b6c-7d8e9f0a1b02",
"counterpartyId": "7d1e4c2a-5b3f-4e8a-9c61-2f0a8b3d4c01",
"address": "0x8c4f2e1d0b9a87766554433221100ffeeddccbba",
"chain": "ARC-TESTNET",
"via": "confirm",
"verification": {
"method": "call",
"contact": "Harbor Print's accounts line, from the vendor file",
"contactOnFileBefore": true,
"note": "Read back the new address on the call."
},
"payeeLock": {
"coolingHours": 24
}
},
"body_hash": "7c040055d7b5699ea69746fd510b4a6870b8b62f40c989c82e070f5bee081482",
"signature": "9d4c736dcab1e695a202ca4d879346525d786ffb9937d4e4897c4ab212a8767240341e79e31028d15744b046fbfeff9666726576f1fac3df5ccbde06e9727301",
"prev_hash": "5a4e61f31d16b7c1c873867f7a2b4756deb63d9d2624a6892ef1340b3ed3ae89",
"hash": "ecedf7e736213c37131c6f2fdf3f5dae528f9d5b687b08122e9a6335dbcce355",
"signing_key_id": "36e3209ae2e6a600",
"check": {
"ok": true
}
},
{
"seq": 5610,
"id": "eab46f04-8b5a-44f1-803b-98e6b0a80f72",
"ts": "2026-10-03T15:20:00.000Z",
"actor": "human",
"domain": "ap",
"action": "approval_paid",
"summary": "Approved and paid 1250 USDC to Harbor Print Co.",
"detail": {
"by": "4b7e0c1a-2d3f-4e5a-8b6c-7d8e9f0a1b02",
"invoiceId": "7d1e4c2a-5b3f-4e8a-9c61-2f0a8b3d4e51",
"counterpartyId": "7d1e4c2a-5b3f-4e8a-9c61-2f0a8b3d4c01",
"amount": 1250,
"currency": "USDC",
"amountPaid": 1250,
"discountTaken": 0,
"overrode": "held",
"txRef": "0x51713792df8660fed8ab6328e9b5023d1d80dcc566e5512abdcd7ef4eb1b92be",
"status": "paid",
"attempt": 1,
"firstPayment": true,
"approvals": [
{
"by": "4b7e0c1a-2d3f-4e5a-8b6c-7d8e9f0a1b03",
"at": "2026-10-03T14:00:00.000Z"
},
{
"by": "4b7e0c1a-2d3f-4e5a-8b6c-7d8e9f0a1b02",
"at": "2026-10-03T15:20:00.000Z"
}
],
"twoApprovalsAbove": 1000
},
"body_hash": "dae21d642023e245c099621bc1a8a1689b0f6d243b62803f464b4e35859c8400",
"signature": "035c519ac40e1dd2bbc7d70e08180b0e624cbc16df3b3a74c2a609c40c26cbe04f0d2a28bb01edbe1f0c0f5c9a52c76127f2c4affc71f7ae0fcdeac82f32b60b",
"prev_hash": "87750f493b785c931c8c69551ad76a1418b935eb8d2704a5c0fca19833cf959e",
"hash": "1bd91f4c85872fe824fc18dfb7409f1ce3bbe63728fe993d070a4e14ef03c070",
"signing_key_id": "36e3209ae2e6a600",
"check": {
"ok": true
}
}
]
}
}dataobjectEvery payout address change in a period,
vestiarion-payee-lock-evidence/1, each fact citing the signed entries it rests on.12 fields in data
formatstringOne of
vestiarion-payee-lock-evidence/1exportedAtstringworkspaceobjectThe workspace the document is of.
2 fields in workspace
slugstringnamestring
networkobjectThe workspace's network.
2 fields in network
idstringOne of
arc-testnetarc-mainnetlabelstringThe network's name, as the workspace's pages write it.
periodobjectWhole UTC days,
YYYY-MM-DD; null for an open end.2 fields in period
fromstring · nullabletostring · nullable
lockobject2 fields in lock
nowobjectThe payee lock's setting.
2 fields in now
onbooleancoolingHoursnumberHours a changed address waits before it can be paid; 0 is no wait.
changesarray of object5 fields in changes
atstringbyanyWho did a step.
fromobject · nullableThe payee lock's setting.
2 fields in from
onbooleancoolingHoursnumberHours a changed address waits before it can be paid; 0 is no wait.
toobject · nullableThe payee lock's setting.
2 fields in to
onbooleancoolingHoursnumberHours a changed address waits before it can be paid; 0 is no wait.
entryinteger
summaryobject9 fields in summary
changesintegerconfirmedintegerconfirmedWithRecordintegerconfirmedBySecondPersonintegerheldWhileUnconfirmedintegerheldForTheWaitintegerheldAsNewPayeeintegerpaidintegerpaidOnlyAfterConfirmationinteger
changesarray of object6 fields in changes
counterpartyobject2 fields in counterparty
idstringnamestring · nullable
changeobject6 fields in change
atstringfromstring · nullabletostring · nullablechainstring · nullableenteredByanyWho did a step.
entryinteger
confirmationobject · nullable13 fields in confirmation
atstringbyanyWho did a step.
viastring · nullableWith Confirm address (
confirm), or by approving a payment to it (approval).recordobject · nullable5 fields in record
methodstring · nullableOne of
callmessagein_personothermethodLabelstring · nullablecontactstring · nullablecontactOnFileBeforebooleannotestring · nullable
secondPersonboolean · nullablesoloConfirmationbooleanbyGiverbooleangiverUnknownbooleanwaitHoursnumber · nullablepayableFromstring · nullablelookalikeOfarray of object2 fields in lookalikeOf
idstringnamestring · nullable
looksLikeEarlierstring · nullableentryinteger
holdsarray of object4 fields in holds
atstringrulestringsubjectobject · nullable2 fields in subject
kindstringOne of
invoicemilestoneidstring
entryinteger
firstPaymentobject · nullable8 fields in firstPayment
atstringamountnumber · nullablecurrencystringtxRefstringtxUrlstring · nullabledecidedBystringOne of
personagentsubjectobject · nullable2 fields in subject
kindstringOne of
invoicemilestoneidstring
entryinteger
checksobject5 fields in checks
recordKeptboolean · nullablecontactOnFileBeforeboolean · nullablesecondPersonboolean · nullablepaidAfterConfirmationboolean · nullablepaidAfterWaitboolean · nullable
signedEntryProvesstringWhat a signed entry proves, and what it does not.
checkAnEntryarray of stringHow to check one entry alone: its body hash, its signature and its chain hash.
keysarray of objectThe workspace's public keys, active and retired, each under its id: what the entries were signed with.
3 fields in keys
idstringThe first 16 hex characters of the SHA-256 of the key's public SPKI: a key counts only under this id.
statusstringOne of
activeretiredpublicKeyPemstring
entriesarray of objectEvery entry the document cites, oldest first, in full, each with the server's check.
14 fields in entries
seqintegeridstring · nullabletsstringactorstringdomainstringactionstringsummarystringdetailobjectbody_hashstringsignaturestringprev_hashstringhashstringsigning_key_idstring · nullablecheckany · nullableThe server's check of this entry alone. A checker re-checks it rather than trust this field.
Errors
| Status | Code | When |
|---|---|---|
| 400 | invalid_request | An invalid limit or cursor, a filter value outside its allowed values, or a request body that does not validate. The message names the parameter or the field, and lists the accepted values. |
| 401 | unauthorized | No key, or a malformed, unknown or revoked one: "A valid API key is required." |
| 403 | forbidden | The key's scopes do not cover this route: "This key cannot do that." Or, on a write, the person who created the key can no longer add records: "This key's issuer can no longer add records in this workspace." |
| 429 | rate_limited | Too many requests; wait as long as Retry-After says before trying again. |
| 500 | internal | An unexpected server error. Implementation details are not exposed. |