Get a payable's receipt
/ api/ v1/ invoices/ {id}/ receiptWhat a receipt states for a paid payable, in the format vestiarion-receipt/1: the amount and token, when it was paid, the address paid and its chain, the transaction, its route and fee, the vendor's invoice number, and what an early-payment discount took off; the ledger entry that recorded the transaction; and two checks, of that entry's signature and of the transaction on the payee's chain. When a member has shared the receipt, shared says when, names the receipt_shared entry that signed its statement, and says whether its link opens now. The link is never in the answer: Vestiarion keeps only its hash.
A payable with no receipt yet answers 200 with ready: false and a notReady code: not_paid; simulated, a sandbox's payment, which moves nothing on chain; not_minted, a payout to another chain whose mint is not recorded yet; no_transaction; or not_recorded. A receivable, or an id this workspace does not hold, answers 404. Text that came from outside, such as a vendor's name or an invoice number, is carried as data.
Send a workspace API key as Authorization: Bearer ….
Parameters
idstringrequiredin: pathThe payable's id, as
GET /api/v1/invoiceslists it.
Try it
The key is kept in memory only, for this page.
Enter id to send the request.
Code samples
curl "https://www.vestiarion.xyz/api/v1/invoices/<id>/receipt" \
-H "Authorization: Bearer $VESTIARION_API_KEY"Response
Example{
"data": {
"format": "vestiarion-receipt/1",
"exportedAt": "2026-10-25T09:00:00.000Z",
"workspace": {
"slug": "northstar-studio",
"name": "Northstar Studio"
},
"network": {
"id": "arc-testnet",
"label": "Arc testnet"
},
"invoiceId": "7d1e4c2a-5b3f-4e8a-9c61-2f0a8b3d4e51",
"ready": true,
"notReady": null,
"facts": {
"amount": 1250,
"token": "USDC",
"paidAt": "2026-10-03T15:20:06.000Z",
"payee": "0x8c4f2e1d0b9a87766554433221100ffeeddccbba",
"chain": "ARC-TESTNET",
"txHash": "0x51713792df8660fed8ab6328e9b5023d1d80dcc566e5512abdcd7ef4eb1b92be",
"route": "direct",
"invoiceNumber": "HP-2026-0412",
"feesPaidBy": "sender"
},
"records": {
"seq": 5610,
"hash": "1bd91f4c85872fe824fc18dfb7409f1ce3bbe63728fe993d070a4e14ef03c070"
},
"invoiceEntry": 5607,
"shared": {
"at": "2026-10-04T09:00:00.000Z",
"entry": 5612,
"linkOpen": true,
"changes": []
},
"checks": {
"recorded": {
"ok": true
},
"onChain": {
"state": "matches",
"block": 4210331,
"received": 1250
}
},
"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": 5607,
"id": "5de39c47-b242-47eb-a130-2507bbed570c",
"ts": "2026-10-03T10:00:00.000Z",
"actor": "human",
"domain": "ap",
"action": "create_invoice",
"summary": "Added a bill from Harbor Print Co. for 1250 USDC",
"detail": {
"by": "4b7e0c1a-2d3f-4e5a-8b6c-7d8e9f0a1b01",
"invoiceId": "7d1e4c2a-5b3f-4e8a-9c61-2f0a8b3d4e51",
"counterpartyId": "7d1e4c2a-5b3f-4e8a-9c61-2f0a8b3d4c01",
"counterpartyName": "Harbor Print Co.",
"amount": 1250,
"currency": "USDC",
"dueDate": "2026-10-20",
"poReference": "PO-1187",
"goodsReceived": true,
"invoiceNumber": "HP-2026-0412",
"document": {
"kind": "pdf",
"reader": "anthropic",
"sha256": "e32253322f3ee8aebb662b9ee42946b3d6b0141da8fc66cddf85ec61e12d0252"
}
},
"body_hash": "6c61a8524fad3add846231b1b10dd84aa9e9ab6294c2768f6d81bd3d0b8c5680",
"signature": "8d3e9041ed41b198745e104251cec68b6a498a35ac2ef01cd0a975c8cc9f9381bf2821fe83edd5f3f4802e07e8957574f85c5ee843a6e84f0eefa0169b90630c",
"prev_hash": "ecedf7e736213c37131c6f2fdf3f5dae528f9d5b687b08122e9a6335dbcce355",
"hash": "199d4e27b5e16792511e46cd55e8fee83ef76fc053e047b10c7de190fd8e740a",
"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
}
},
{
"seq": 5612,
"id": "33e7453e-1c5e-47b4-9d75-b2444045656d",
"ts": "2026-10-04T09:00:00.000Z",
"actor": "human",
"domain": "ap",
"action": "receipt_shared",
"summary": "Receipt: 1250 USDC paid on Arc testnet",
"detail": {
"receipt": {
"amount": 1250,
"token": "USDC",
"paidAt": "2026-10-03T15:20:06.000Z",
"payee": "0x8c4f2e1d0b9a87766554433221100ffeeddccbba",
"chain": "ARC-TESTNET",
"txHash": "0x51713792df8660fed8ab6328e9b5023d1d80dcc566e5512abdcd7ef4eb1b92be",
"route": "direct",
"invoiceNumber": "HP-2026-0412",
"feesPaidBy": "sender"
},
"records": {
"seq": 5610,
"hash": "1bd91f4c85872fe824fc18dfb7409f1ce3bbe63728fe993d070a4e14ef03c070"
}
},
"body_hash": "51ed22303181009c5ae6edfffda627d61365f3688187cd106dc4dc774bc0b9bc",
"signature": "7c119a4807056a07dd11ff42f36e4333b8b31182df148388a15479a7cc8ce8cbffe483133de7c3d07981bba1506af73a23404a973343ec66180d5abf18556001",
"prev_hash": "655b287db5c7d17fdf9f87425bd3a434555a89ea8dbc71125b319d7569dfd785",
"hash": "b2687ac1ce1ae6f949ccd43e446e22fe7b36dc6dda1eebaa66d40afdca2fba81",
"signing_key_id": "36e3209ae2e6a600",
"check": {
"ok": true
}
}
]
}
}dataobjectA payable's receipt,
vestiarion-receipt/1: what it states, the entry that recorded it, its sharing and its checks.16 fields in data
formatstringOne of
vestiarion-receipt/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.
invoiceIdstringreadybooleanPaid, confirmed, on chain, and a signed entry records its transaction: what Share receipt needs.
notReadyobject · nullableWhy not, when not ready.
simulatednever changes;not_paidandnot_mintedpass.2 fields in notReady
codestringOne of
not_payablenot_paidsimulatednot_mintedno_transactionnot_recordedreasonstring
factsobject · nullableWhat a receipt states for this payment, as Share receipt would state it now.
12 fields in facts
amountnumbertokenstringOne of
USDCEURCpaidAtstringWhen the payment was confirmed.
payeestringThe address paid.
chainstringThe chain the payee was paid on.
txHashstringThe transaction that paid the payee: the transfer on the workspace's network, or the mint on the payee's chain.
routestringOne of
directcctpgatewaysourceTxHashstring · optionalCCTP only: the burn on the workspace's network.
feeUsdcnumber · optionalCCTP and Gateway: the route's fee, in USDC.
invoiceNumberstring · optionalThe invoice's own number, as the vendor wrote it.
invoiceAmountnumber · optionalThe invoice's amount, only when it was for more than was paid: an early-payment discount.
feesPaidBystring · optionalWho paid the fees: the sender, on top of the amount, and never the payee.
One of
sender
recordsobject · nullableThe entry that recorded the transaction; null when not ready.
2 fields in records
seqintegerhashstring
invoiceEntryinteger · nullableThe entry the bill was added with, which its invoice number comes from, or null.
sharedobject · nullableWhen a member shared the receipt; null when no one has.
4 fields in shared
atstringWhen a member first shared it.
entryintegerThe
receipt_sharedentry that signed the statement the payee saw.linkOpenbooleanWhether its link opens now. The link itself is never in the answer.
changesarray of object3 fields in changes
actionstringOne of
receipt_link_renewedreceipt_revokedatstringentryinteger
checksobject · nullableThe receipt's two checks; null when not ready.
2 fields in checks
recordedanyThe recording entry checked alone, and holding the transaction.
onChainanyThe transaction as its chain records it: it matches the payment, it does not, or the chain could not be read just now.
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 |
|---|---|---|
| 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." |
| 404 | not_found | The requested resource does not exist in the key's 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. |