# Get a payable's receipt

`GET /api/v1/invoices/{id}/receipt`

What 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](https://www.vestiarion.xyz/docs/get-started/authentication) as `Authorization: Bearer <key>`.

## Parameters

| Name | In | Type | Required | Default | Allowed values | Description |
| --- | --- | --- | --- | --- | --- | --- |
| `id` | path | string | Required | — | — | The payable's id, as `GET /api/v1/invoices` lists it. |

## Code samples

```bash
curl "https://www.vestiarion.xyz/api/v1/invoices/<id>/receipt" \
  -H "Authorization: Bearer $VESTIARION_API_KEY"
```

## Response

Example, `200` `application/json`:

```json
{
  "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
        }
      }
    ]
  }
}
```

**Fields**

- `data` (object, required): A payable's receipt, `vestiarion-receipt/1`: what it states, the entry that recorded it, its sharing and its checks.
  - `format` (string, required) One of `vestiarion-receipt/1`.
  - `exportedAt` (string, required)
  - `workspace` (object, required): The workspace the document is of.
    - `slug` (string, required)
    - `name` (string, required)
  - `network` (object, required): The workspace's network.
    - `id` (string, required) One of `arc-testnet`, `arc-mainnet`.
    - `label` (string, required): The network's name, as the workspace's pages write it.
  - `invoiceId` (string, required)
  - `ready` (boolean, required): Paid, confirmed, on chain, and a signed entry records its transaction: what Share receipt needs.
  - `notReady` (object, nullable, required): Why not, when not ready. `simulated` never changes; `not_paid` and `not_minted` pass.
    - `code` (string, required) One of `not_payable`, `not_paid`, `simulated`, `not_minted`, `no_transaction`, `not_recorded`.
    - `reason` (string, required)
  - `facts` (object, nullable, required): What a receipt states for this payment, as Share receipt would state it now.
    - `amount` (number, required)
    - `token` (string, required) One of `USDC`, `EURC`.
    - `paidAt` (string, required): When the payment was confirmed.
    - `payee` (string, required): The address paid.
    - `chain` (string, required): The chain the payee was paid on.
    - `txHash` (string, required): The transaction that paid the payee: the transfer on the workspace's network, or the mint on the payee's chain.
    - `route` (string, required) One of `direct`, `cctp`, `gateway`.
    - `sourceTxHash` (string, optional): CCTP only: the burn on the workspace's network.
    - `feeUsdc` (number, optional): CCTP and Gateway: the route's fee, in USDC.
    - `invoiceNumber` (string, optional): The invoice's own number, as the vendor wrote it.
    - `invoiceAmount` (number, optional): The invoice's amount, only when it was for more than was paid: an early-payment discount.
    - `feesPaidBy` (string, optional): Who paid the fees: the sender, on top of the amount, and never the payee. One of `sender`.
  - `records` (object, nullable, required): The entry that recorded the transaction; null when not ready.
    - `seq` (integer, required)
    - `hash` (string, required)
  - `invoiceEntry` (integer, nullable, required): The entry the bill was added with, which its invoice number comes from, or null.
  - `shared` (object, nullable, required): When a member shared the receipt; null when no one has.
    - `at` (string, required): When a member first shared it.
    - `entry` (integer, required): The `receipt_shared` entry that signed the statement the payee saw.
    - `linkOpen` (boolean, required): Whether its link opens now. The link itself is never in the answer.
    - `changes` (array of object, required)
      - `action` (string, required) One of `receipt_link_renewed`, `receipt_revoked`.
      - `at` (string, required)
      - `entry` (integer, required)
  - `checks` (object, nullable, required): The receipt's two checks; null when not ready.
    - `recorded` (any, required): The recording entry checked alone, and holding the transaction.
    - `onChain` (any, required): The transaction as its chain records it: it matches the payment, it does not, or the chain could not be read just now.
  - `signedEntryProves` (string, required): What a signed entry proves, and what it does not.
  - `checkAnEntry` (array of string, required): How to check one entry alone: its body hash, its signature and its chain hash.
  - `keys` (array of object, required): The workspace's public keys, active and retired, each under its id: what the entries were signed with.
    - `id` (string, required): The first 16 hex characters of the SHA-256 of the key's public SPKI: a key counts only under this id.
    - `status` (string, required) One of `active`, `retired`.
    - `publicKeyPem` (string, required)
  - `entries` (array of object, required): Every entry the document cites, oldest first, in full, each with the server's check.
    - `seq` (integer, required)
    - `id` (string, nullable, required)
    - `ts` (string, required)
    - `actor` (string, required)
    - `domain` (string, required)
    - `action` (string, required)
    - `summary` (string, required)
    - `detail` (object, required)
    - `body_hash` (string, required)
    - `signature` (string, required)
    - `prev_hash` (string, required)
    - `hash` (string, required)
    - `signing_key_id` (string, nullable, required)
    - `check` (any, nullable, required): The 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. |
