POST requests that return 201 with the outgoing transaction that carries the action — never the on-chain result. Track that transaction with the Canton Transaction Webhooks or by reading it directly to see how it resolved.
Idempotency
Both endpoints accept the optionalIdempotency-Key header. Resending a request with the same key returns the original response instead of submitting a second time. See API Idempotency.
Make a Canton call
See the full generated reference at Make a Canton call.type selects the call and the shape of payload. An unknown or missing type, or a payload missing a required field, is a 400.
ALLOCATION_WITHDRAW is the only call implemented in v1. Every other type is a documented 501 today — the request shape below is the committed contract, not a preview of working behavior.ParticipantOnboardingPayload
EndInvestorPayload
Shared by invite, invite-cancel, and offboard — identical wire shape, different verb.AllowListPayload
AllocationWithdrawPayload
Only accepted while that transaction sits at
status CONFIRMING / subStatus ALLOCATED. See The ALLOCATED lifecycle.
201 returns the outgoing withdrawal transaction:
status here is always SUBMITTED — it is the transaction’s status at the moment of this response, not its outcome. Its resolution to COMPLETED or CANCELLED arrives later, by webhook or by re-reading the transaction.
Responses
Answer an offer
See the full generated reference at Answer an offer.offerId is the Fireblocks transaction id of the incoming offer — the same id you read from cantonDetails.offerResponse or from the webhook’s data.id. See Decide whether an offer can be responded to before calling this.
The body nests two layers of discrimination: domain selects response, and inside response, responseType selects the variant. Both layers are closed — sending an onboarding responseType under domain: ALLOCATION is a 400, regardless of what the offer’s own domain is.
domain: TRANSFER exists so the endpoint’s contract covers every offer domain, not because transfer responses work today. Both TRANSFER_ACCEPT and TRANSFER_REJECT return 501 in v1.reason on a DTCC onboarding rejection is recorded on-chain, where the counterparty can read it. The Tradeweb rejection carries no reason — its DAR has nowhere on-ledger to record one, so the field does not exist on that variant.
201 echoes the responseType back so you can correlate the response without re-reading it: