Sign a treasury transfer
Add the calling signer’s signature over the transfer relayHash, in the form the enrolled key produces. An eoa signer submits a 65-byte secp256k1 signature over the raw hash (sign({ hash }), never an EIP-191 personal_sign digest — the account recovers with ECDSA.tryRecover on the hash itself). A webauthn signer submits the abi-encoded passkey assertion whose clientDataJSON challenge is base64url(relayHash), verified server-side exactly as the on-chain verifier will. The signer must be active — validated but not yet on chain is not enough, the account would reject it.
The signature that completes the threshold hands the transfer to the relay; from then on it can no longer be cancelled.
Request
- Base URL: https://api.prod.keyban.io
- URL: https://api.prod.keyban.io/v1/multisig-wallets/{walletId}/intents/{intentId}/approvals
- Auth: one of:
- API key in header X-Api-Key
- bearer (a scheme the document does not define)
Path parameters
The unique identifier of the multisig wallet
The transfer to sign
Request body
Example request
{
"signature": "0x111111111111111111111111111111111111111111111111111111111111111122222222222222222222222222222222222222222222222222222222222222221b"
}Response
Signature recorded
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.