Multisig Wallets

Get a treasury transfer

Full state of one transfer, including the signing pre-image and how many signatures it has collected. Reading also repairs: an unknown transfer is reconciled against the chain, and one left broadcasting with no relay behind it is queued again — so polling this endpoint, or the list, is what frees the treasury's transfer slot.

get/v1/multisig-wallets/{walletId}/intents/{intentId}

Request

  • Base URL: https://api.prod.keyban.io
  • URL: https://api.prod.keyban.io/v1/multisig-wallets/{walletId}/intents/{intentId}
  • Auth: one of:
    • API key in header X-Api-Key
    • bearer (a scheme the document does not define)

Path parameters

walletIdstring uuid required

The unique identifier of the multisig wallet

intentIdstring uuid required

The transfer to read

Response

Transfer retrieved successfully

idstring uuid required

Entity UUID

createdAtstring date-time required

Creation date (ISO 8601)

updatedAtstring date-time required

Last update date (ISO 8601)

status'pending' | 'broadcasting' | 'unknown' | 'executed' | 'failed' | 'cancelled' | 'expired' required

Lifecycle: pending (collecting signatures), broadcasting (threshold reached, relay in progress), executed (mined, txHash set), failed (reverted or never broadcast), unknown (outcome undetermined — the transfer may have landed, and no new intent is accepted until it is reconciled), cancelled, expired.

totalAmountstring required

Sum of the leg amounts in USDC sub-units, as a decimal string. Derived, never stored.

relayNoncestring required

Account relay nonce the signatures are bound to, as a decimal string. One nonce covers the whole lot. If the account moves past it, the intent fails without broadcasting.

relayHashstring required

What each signer signs. Single-leg lot: keccak256(abi.encode(chainId, account, nonce, dest, value, keccak256(data))). Two legs or more: keccak256(abi.encode(chainId, account, nonce, keccak256(abi.encode(calls)))) over the ordered (dest, value, data) legs. The app must recompute it locally from the other fields and refuse to sign on a mismatch.

approvalCountinteger required

Signatures collected so far, out of the wallet threshold.

expiresAtstring date-time required

End of the signing window. Past it the intent expires on its next touch and the collected signatures are purged.

txHashstring nullable

Hash of the relayed transaction. Null until executed — and can stay null on an intent reconciled as executed after an ambiguous broadcast, where only the consumed account nonce proves execution.

errorstring nullable

Why the transfer failed, or what made its outcome undetermined. Null while pending or once executed.

Example response

{
  "status": "pending",
  "transfers": [
    {
      "agentWalletId": "550e8400-e29b-41d4-a716-446655440000",
      "targetAddress": "0xcb0c0dca4246bb0f6b3309d64e7e35002cc3af1f",
      "amount": "1500000",
      "destinationLabel": "Prestataire Acme",
      "destinationKind": "contact"
    }
  ],
  "totalAmount": "4000000",
  "fiat": {
    "currency": "EUR",
    "centiPerUsdc": 92
  },
  "relayNonce": "3",
  "relayHash": "0x4d2f8c1e9b7a3d5f0c2e8a6b4d1f9c3e7a5b8d2f4c6e9a1b3d5f7c9e2a4b6d8f",
  "approvalCount": 1,
  "txHash": "0x4d2f8c1e9b7a3d5f0c2e8a6b4d1f9c3e7a5b8d2f4c6e9a1b3d5f7c9e2a4b6d8f"
}

Changes

No recorded changes to this operation across all 1 revision of this API.