---
title: "Answer an offer"
method: POST
path: "/operations/canton/offers/{offerId}/responses"
tags: ["Canton (Beta)"]
---

# Answer an offer

`POST /operations/canton/offers/{offerId}/responses`

## Request

- Base URL: `https://api.fireblocks.io/v1`
- URL: `https://api.fireblocks.io/v1/operations/canton/offers/{offerId}/responses`
- Auth: none declared
- TypeScript: <https://skmtc.dev/fireblocks/apis/fireblocks-api/docs/operations/canton/offers/:offerId/responses/post.ts> (a function with typed inputs; its response is checked against the schema)

Responds to an incoming Canton offer. Set `responseType` to one of the values in the offer transaction's `cantonDetails.offerResponse.availableResponses`.

## Path parameters

- `offerId` string, required

## Headers

- `Idempotency-Key` string

## Request body

- union
  - OfferResponseDtccOnboardingAccept: Accept a DTCC end-investor onboarding offer. Carries no arguments.
    - `responseType` 'DTCC_END_INVESTOR_ONBOARDING_ACCEPT', required: How you are answering the offer — one of the offer transaction's `cantonDetails.offerResponse.availableResponses`. That list does not change after the offer arrives; check `expiresAt` and the transaction status to see whether it is still answerable.
  - OfferResponseDtccOnboardingReject: Reject a DTCC end-investor onboarding offer.
    - `responseType` 'DTCC_END_INVESTOR_ONBOARDING_REJECT', required: How you are answering the offer — one of the offer transaction's `cantonDetails.offerResponse.availableResponses`. That list does not change after the offer arrives; check `expiresAt` and the transaction status to see whether it is still answerable.
    - `payload` DtccOnboardingRejectPayload, required
      - `reason` string, required: Why the offer is being rejected. Recorded on-chain, where the counterparty can read it.
  - OfferResponseTradewebAccept: Accept a Tradeweb co-signing delegation offer. Carries no arguments.
    - `responseType` 'TRADEWEB_COSIGNING_DELEGATION_ACCEPT', required: How you are answering the offer — one of the offer transaction's `cantonDetails.offerResponse.availableResponses`. That list does not change after the offer arrives; check `expiresAt` and the transaction status to see whether it is still answerable.
  - OfferResponseTradewebReject: Reject a Tradeweb co-signing delegation offer. Carries no arguments — Tradeweb does not record a reject reason on the ledger, so none is accepted.
    - `responseType` 'TRADEWEB_COSIGNING_DELEGATION_REJECT', required: How you are answering the offer — one of the offer transaction's `cantonDetails.offerResponse.availableResponses`. That list does not change after the offer arrives; check `expiresAt` and the transaction status to see whether it is still answerable.
  - OfferResponseAllocationAccept: Accept a CIP-56 allocation request. Carries no arguments.
    - `responseType` 'ALLOCATION_ACCEPT', required: How you are answering the offer — one of the offer transaction's `cantonDetails.offerResponse.availableResponses`. That list does not change after the offer arrives; check `expiresAt` and the transaction status to see whether it is still answerable.
  - OfferResponseAllocationReject: Reject a CIP-56 allocation request. Carries no arguments.
    - `responseType` 'ALLOCATION_REJECT', required: How you are answering the offer — one of the offer transaction's `cantonDetails.offerResponse.availableResponses`. That list does not change after the offer arrives; check `expiresAt` and the transaction status to see whether it is still answerable.
  - OfferResponseTransferAccept: Accept an inbound 2-step transfer offer. Carries no arguments.
    - `responseType` 'TRANSFER_ACCEPT', required: How you are answering the offer — one of the offer transaction's `cantonDetails.offerResponse.availableResponses`. That list does not change after the offer arrives; check `expiresAt` and the transaction status to see whether it is still answerable.
  - OfferResponseTransferReject: Reject an inbound 2-step transfer offer. Carries no arguments.
    - `responseType` 'TRANSFER_REJECT', required: How you are answering the offer — one of the offer transaction's `cantonDetails.offerResponse.availableResponses`. That list does not change after the offer arrives; check `expiresAt` and the transaction status to see whether it is still answerable.
  - OfferResponseTransferWithdraw: Withdraw your own outgoing transfer offer. Carries no arguments — `offerId` in the path identifies the offer, and the vault account and blockchain are resolved from it.
    - `responseType` 'TRANSFER_WITHDRAW', required: How you are answering the offer — one of the offer transaction's `cantonDetails.offerResponse.availableResponses`. That list does not change after the offer arrives; check `expiresAt` and the transaction status to see whether it is still answerable.
  - OfferResponseAllocationWithdraw: Withdraw the allocation you made by accepting this offer, unlocking the holding. Carries no arguments — the allocation is resolved from the offer. Answers `409` until the accept has settled.
    - `responseType` 'ALLOCATION_WITHDRAW', required: How you are answering the offer — one of the offer transaction's `cantonDetails.offerResponse.availableResponses`. That list does not change after the offer arrives; check `expiresAt` and the transaction status to see whether it is still answerable.

## Response `201`

The outgoing transaction that carries the response. Its on-chain outcome arrives by webhook as a status update on this transaction.

- OfferResponseAccepted: The outgoing transaction that carries the response. Its on-chain outcome arrives by webhook as a status update on this transaction.
  - `transactionId` string, required: The outgoing response transaction.
  - `status` string, required: The transaction's status at the time of this response — `SUBMITTED`.
  - `responseType` string, required: The response type you sent, echoed back so you can correlate without re-reading.

## Other responses

- `400`: Unknown or missing responseType, or a missing required payload field, or the response is not available to this workspace's side of the offer (a sender sending accept/reject, a receiver sending withdraw)
- `404`: Unknown offer id for this tenant
- `409`: The offer cannot take this response now. An accept or reject: the offer is already answered, expired, or a response is in flight. ALLOCATION_WITHDRAW — which is sent AFTER the accept, on the same offer: the allocation is not ALLOCATED, because the accept has not settled yet, or it was already withdrawn or settled by the venue. The message names the state.
- `501`: This responseType is not yet available
- `default`: Error Response

---

[API](https://skmtc.dev/fireblocks/apis/fireblocks-api.md) - [All operations](https://skmtc.dev/fireblocks/apis/fireblocks-api/llms.txt) - [OpenAPI document](https://skmtc.dev/fireblocks/apis/fireblocks-api/revisions/4eba9965659a?raw)
