Skip to content

Get the payee lock's evidence

GET/api/v1/payee-lock/evidence

Every 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

  • fromstringoptional

    The first day, as YYYY-MM-DD, in UTC. Leave it out to start from the first change.

  • tostringoptional

    The 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
curl "https://www.vestiarion.xyz/api/v1/payee-lock/evidence" \
  -H "Authorization: Bearer $VESTIARION_API_KEY"

Response

Example
200 · application/json
{
  "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
        }
      }
    ]
  }
}
Fields
  • dataobject

    Every payout address change in a period, vestiarion-payee-lock-evidence/1, each fact citing the signed entries it rests on.

    12 fields in data
    • formatstring

      One ofvestiarion-payee-lock-evidence/1

    • exportedAtstring
    • workspaceobject

      The workspace the document is of.

      2 fields in workspace
      • slugstring
      • namestring
    • networkobject

      The workspace's network.

      2 fields in network
      • idstring

        One ofarc-testnetarc-mainnet

      • labelstring

        The network's name, as the workspace's pages write it.

    • periodobject

      Whole UTC days, YYYY-MM-DD; null for an open end.

      2 fields in period
      • fromstring · nullable
      • tostring · nullable
    • lockobject
      2 fields in lock
      • nowobject

        The payee lock's setting.

        2 fields in now
        • onboolean
        • coolingHoursnumber

          Hours a changed address waits before it can be paid; 0 is no wait.

      • changesarray of object
        5 fields in changes
        • atstring
        • byany

          Who did a step.

        • fromobject · nullable

          The payee lock's setting.

          2 fields in from
          • onboolean
          • coolingHoursnumber

            Hours a changed address waits before it can be paid; 0 is no wait.

        • toobject · nullable

          The payee lock's setting.

          2 fields in to
          • onboolean
          • coolingHoursnumber

            Hours a changed address waits before it can be paid; 0 is no wait.

        • entryinteger
    • summaryobject
      9 fields in summary
      • changesinteger
      • confirmedinteger
      • confirmedWithRecordinteger
      • confirmedBySecondPersoninteger
      • heldWhileUnconfirmedinteger
      • heldForTheWaitinteger
      • heldAsNewPayeeinteger
      • paidinteger
      • paidOnlyAfterConfirmationinteger
    • changesarray of object
      6 fields in changes
      • counterpartyobject
        2 fields in counterparty
        • idstring
        • namestring · nullable
      • changeobject
        6 fields in change
        • atstring
        • fromstring · nullable
        • tostring · nullable
        • chainstring · nullable
        • enteredByany

          Who did a step.

        • entryinteger
      • confirmationobject · nullable
        13 fields in confirmation
        • atstring
        • byany

          Who did a step.

        • viastring · nullable

          With Confirm address (confirm), or by approving a payment to it (approval).

        • recordobject · nullable
          5 fields in record
          • methodstring · nullable

            One ofcallmessagein_personother

          • methodLabelstring · nullable
          • contactstring · nullable
          • contactOnFileBeforeboolean
          • notestring · nullable
        • secondPersonboolean · nullable
        • soloConfirmationboolean
        • byGiverboolean
        • giverUnknownboolean
        • waitHoursnumber · nullable
        • payableFromstring · nullable
        • lookalikeOfarray of object
          2 fields in lookalikeOf
          • idstring
          • namestring · nullable
        • looksLikeEarlierstring · nullable
        • entryinteger
      • holdsarray of object
        4 fields in holds
        • atstring
        • rulestring
        • subjectobject · nullable
          2 fields in subject
          • kindstring

            One ofinvoicemilestone

          • idstring
        • entryinteger
      • firstPaymentobject · nullable
        8 fields in firstPayment
        • atstring
        • amountnumber · nullable
        • currencystring
        • txRefstring
        • txUrlstring · nullable
        • decidedBystring

          One ofpersonagent

        • subjectobject · nullable
          2 fields in subject
          • kindstring

            One ofinvoicemilestone

          • idstring
        • entryinteger
      • checksobject
        5 fields in checks
        • recordKeptboolean · nullable
        • contactOnFileBeforeboolean · nullable
        • secondPersonboolean · nullable
        • paidAfterConfirmationboolean · nullable
        • paidAfterWaitboolean · nullable
    • signedEntryProvesstring

      What a signed entry proves, and what it does not.

    • checkAnEntryarray of string

      How to check one entry alone: its body hash, its signature and its chain hash.

    • keysarray of object

      The workspace's public keys, active and retired, each under its id: what the entries were signed with.

      3 fields in keys
      • idstring

        The first 16 hex characters of the SHA-256 of the key's public SPKI: a key counts only under this id.

      • statusstring

        One ofactiveretired

      • publicKeyPemstring
    • entriesarray of object

      Every entry the document cites, oldest first, in full, each with the server's check.

      14 fields in entries
      • seqinteger
      • idstring · nullable
      • tsstring
      • actorstring
      • domainstring
      • actionstring
      • summarystring
      • detailobject
      • body_hashstring
      • signaturestring
      • prev_hashstring
      • hashstring
      • signing_key_idstring · nullable
      • checkany · nullable

        The server's check of this entry alone. A checker re-checks it rather than trust this field.

Errors

StatusCodeWhen
400invalid_requestAn 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.
401unauthorizedNo key, or a malformed, unknown or revoked one: "A valid API key is required."
403forbiddenThe 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."
429rate_limitedToo many requests; wait as long as Retry-After says before trying again.
500internalAn unexpected server error. Implementation details are not exposed.