Add a signer to a customer's wallets
Adds a new signer to the customer’s wallet infrastructure. The synchronous response returns a verificationUrl whose audience is given by urlAudience: a passkey signer gets their own enrollment link (urlAudience: "signer", also delivered via the wallet_signer.invited webhook) — deliver it to the signer; an api_key signer that parks for admin approval gets a customer admin’s co-stamp link (urlAudience: "admin", also delivered via the wallet_ceremony.awaiting_admin_approval webhook) — deliver it to an admin; a synchronously-admitted api_key signer returns null/null. Conduit never emails anyone — your platform delivers the link. Route by urlAudience, never assume the URL is the signer’s.
Authorizations
Headers
Caller-generated unique key that lets the server safely replay this request. The cached response is returned for 5 minutes on any retry with the same key from the same API principal. Required on every state-changing money-moving or resource-creating POST.
1 - 128^[A-Za-z0-9_.:-]{1,128}$Path Parameters
Body
Email address of the signer to add
^(?!\.)(?!.*\.\.)([A-Za-z0-9_'+\-\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\-]*\.)+[A-Za-z]{2,}$"signer@example.com"
Display name of the signer
"Jane Doe"
admin = root-quorum member + signing-quorum member; signer = signing-quorum only
admin, signer How this signer will stamp. api_key requires publicKey.
passkey, api_key Machine-signer P-256 compressed public key (33 bytes, 02/03 prefix + 64 hex chars, optional 0x prefix). Required when credentialType=api_key.
"02a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0a1b2"
Response
Unique wallet signer identifier
^wsg_[0-9A-Za-z]{22}$Signer's email address
"signer@example.com"
Signer's display name
"Jane Doe"
admin = root-quorum member + signing-quorum member; signer = signing-quorum only
admin, signer How this signer stamps requests
passkey, api_key Number of passkeys enrolled for this signer
0 <= x <= 90071992547409910
Current signer status
pending_activation, activating, active, pending_removal, removed, error Timestamp when the signer was created
"2026-01-15T09:30:00.000Z"
Timestamp when the signer was last updated
"2026-01-15T09:30:00.000Z"
Synchronous URL for this add, or null when none applies. Read urlAudience to know who it is for before delivering it — a passkey add returns the signer's enrollment link, an api_key add pending approval returns a customer admin's co-stamp link.
"https://app.conduit.financial/verify/vtok_2xKjF9mQb7vN4hL1pR3w8t"
Audience of verificationUrl: signer = the new signer's credential-enrollment link (deliver to the signer); admin = a customer admin's approval link (deliver to an admin; also delivered via the wallet_ceremony.awaiting_admin_approval webhook); null when there is no URL.
signer, admin