> ## Documentation Index
> Fetch the complete documentation index at: https://tetrafi.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Patch apiv1workspaces webhooks

> Update any of url, events or active without recreating the endpoint. URLs use the same HTTPS and SSRF validation as creation; events must be current subscription names. Changing url or events makes the caller the endpoint's accountable principal, whose read rights then govern protected event delivery; changing only active keeps the existing principal. API keys require webhooks_manage and current manage_webhooks permission. Human sessions require manage_webhooks or manage_credentials.



## OpenAPI

````yaml /api-reference/openapi.json patch /api/v1/workspaces/{workspaceId}/webhooks/{webhookId}
openapi: 3.1.0
info:
  description: >-
    TetraFi is an API for institutional trading across on-chain and off-chain
    venues: discover assets, request quotes, place an order by quote id and read
    its status. API keys sign every request.


    Asset-pair quotes: every tagged union is tagged by `kind`; only the outcome
    of `/prices` rows and `sources[]` entries is tagged by `status`.
  title: TetraFi API
  version: 1.0.0-beta.1
servers:
  - url: https://api.tetrafi.io
security:
  - api_key: []
tags:
  - description: Request price quotes from multiple solvers for cross-chain transactions
    name: quotes
  - description: Submit, track, and manage cross-chain orders
    name: orders
  - description: Canonical trading pairs and aggregator metadata
    name: trading
  - description: >-
      Authentication — registration, login, SIWE, OAuth, sessions, login
      activity
    name: auth
  - description: Workspace CRUD, settings, members, and team management
    name: workspaces
  - description: >-
      Webhook management — CRUD, secret rotation, test delivery, delivery
      history
    name: webhooks
paths:
  /api/v1/workspaces/{workspaceId}/webhooks/{webhookId}:
    patch:
      tags:
        - webhooks
      description: >-
        Update any of url, events or active without recreating the endpoint.
        URLs use the same HTTPS and SSRF validation as creation; events must be
        current subscription names. Changing url or events makes the caller the
        endpoint's accountable principal, whose read rights then govern
        protected event delivery; changing only active keeps the existing
        principal. API keys require webhooks_manage and current manage_webhooks
        permission. Human sessions require manage_webhooks or
        manage_credentials.
      operationId: update_webhook
      parameters:
        - $ref: '#/components/parameters/WorkspaceId'
        - description: Workspace ID
          in: path
          name: workspaceId
          required: true
          schema:
            type: string
        - description: Webhook ID
          in: path
          name: webhookId
          required: true
          schema:
            type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/UpdateWebhookRequest'
        required: true
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WebhookConfig'
          description: Webhook updated
          headers:
            x-ratelimit-limit:
              description: >-
                Sent only when the request's API key has its own
                requests-per-minute limit: that limit. Sessions, and keys
                without their own limit, never receive it.
              schema:
                minimum: 0
                type: integer
            x-ratelimit-remaining:
              description: >-
                Requests left before this caller is limited: the per-address
                limit's when that limit counted the request, otherwise the API
                key's own remaining allowance. Absent when no finite limit
                counted the request.
              schema:
                minimum: 0
                type: integer
            x-ratelimit-reset:
              description: >-
                Sent with x-ratelimit-limit, only when the request's API key has
                its own limit: whole seconds until that allowance is full again.
              schema:
                minimum: 0
                type: integer
            x-request-id:
              description: >-
                The request's id: the caller's valid `X-Request-Id`, or a
                generated UUID v4. Quote it when asking for support.
              schema:
                type: string
        '400':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiError'
          description: Invalid URL, empty update or unknown event
          headers:
            x-ratelimit-limit:
              description: >-
                Sent only when the request's API key has its own
                requests-per-minute limit: that limit. Sessions, and keys
                without their own limit, never receive it.
              schema:
                minimum: 0
                type: integer
            x-ratelimit-remaining:
              description: >-
                Requests left before this caller is limited: the per-address
                limit's when that limit counted the request, otherwise the API
                key's own remaining allowance. Absent when no finite limit
                counted the request.
              schema:
                minimum: 0
                type: integer
            x-ratelimit-reset:
              description: >-
                Sent with x-ratelimit-limit, only when the request's API key has
                its own limit: whole seconds until that allowance is full again.
              schema:
                minimum: 0
                type: integer
            x-request-id:
              description: >-
                The request's id: the caller's valid `X-Request-Id`, or a
                generated UUID v4. Quote it when asking for support.
              schema:
                type: string
        '401':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiError'
          description: Authentication is missing or invalid.
          headers:
            WWW-Authenticate:
              description: >-
                Sent when the request presented a bearer token and it was
                refused: `Bearer error="invalid_token"` (RFC 6750 section 3).
                Exchange a new token. A refused API key carries no challenge.
              schema:
                type: string
            x-ratelimit-limit:
              description: >-
                Sent only when the request's API key has its own
                requests-per-minute limit: that limit. Sessions, and keys
                without their own limit, never receive it.
              schema:
                minimum: 0
                type: integer
            x-ratelimit-remaining:
              description: >-
                Requests left before this caller is limited: the per-address
                limit's when that limit counted the request, otherwise the API
                key's own remaining allowance. Absent when no finite limit
                counted the request.
              schema:
                minimum: 0
                type: integer
            x-ratelimit-reset:
              description: >-
                Sent with x-ratelimit-limit, only when the request's API key has
                its own limit: whole seconds until that allowance is full again.
              schema:
                minimum: 0
                type: integer
            x-request-id:
              description: >-
                The request's id: the caller's valid `X-Request-Id`, or a
                generated UUID v4. Quote it when asking for support.
              schema:
                type: string
        '403':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiError'
          description: Forbidden
          headers:
            x-ratelimit-limit:
              description: >-
                Sent only when the request's API key has its own
                requests-per-minute limit: that limit. Sessions, and keys
                without their own limit, never receive it.
              schema:
                minimum: 0
                type: integer
            x-ratelimit-remaining:
              description: >-
                Requests left before this caller is limited: the per-address
                limit's when that limit counted the request, otherwise the API
                key's own remaining allowance. Absent when no finite limit
                counted the request.
              schema:
                minimum: 0
                type: integer
            x-ratelimit-reset:
              description: >-
                Sent with x-ratelimit-limit, only when the request's API key has
                its own limit: whole seconds until that allowance is full again.
              schema:
                minimum: 0
                type: integer
            x-request-id:
              description: >-
                The request's id: the caller's valid `X-Request-Id`, or a
                generated UUID v4. Quote it when asking for support.
              schema:
                type: string
        '404':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiError'
          description: Not found
          headers:
            x-ratelimit-limit:
              description: >-
                Sent only when the request's API key has its own
                requests-per-minute limit: that limit. Sessions, and keys
                without their own limit, never receive it.
              schema:
                minimum: 0
                type: integer
            x-ratelimit-remaining:
              description: >-
                Requests left before this caller is limited: the per-address
                limit's when that limit counted the request, otherwise the API
                key's own remaining allowance. Absent when no finite limit
                counted the request.
              schema:
                minimum: 0
                type: integer
            x-ratelimit-reset:
              description: >-
                Sent with x-ratelimit-limit, only when the request's API key has
                its own limit: whole seconds until that allowance is full again.
              schema:
                minimum: 0
                type: integer
            x-request-id:
              description: >-
                The request's id: the caller's valid `X-Request-Id`, or a
                generated UUID v4. Quote it when asking for support.
              schema:
                type: string
        '408':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiError'
          description: The request timed out before a response was ready.
          headers:
            x-ratelimit-limit:
              description: >-
                Sent only when the request's API key has its own
                requests-per-minute limit: that limit. Sessions, and keys
                without their own limit, never receive it.
              schema:
                minimum: 0
                type: integer
            x-ratelimit-remaining:
              description: >-
                Requests left before this caller is limited: the per-address
                limit's when that limit counted the request, otherwise the API
                key's own remaining allowance. Absent when no finite limit
                counted the request.
              schema:
                minimum: 0
                type: integer
            x-ratelimit-reset:
              description: >-
                Sent with x-ratelimit-limit, only when the request's API key has
                its own limit: whole seconds until that allowance is full again.
              schema:
                minimum: 0
                type: integer
            x-request-id:
              description: >-
                The request's id: the caller's valid `X-Request-Id`, or a
                generated UUID v4. Quote it when asking for support.
              schema:
                type: string
        '409':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiError'
          description: URL already registered
          headers:
            x-ratelimit-limit:
              description: >-
                Sent only when the request's API key has its own
                requests-per-minute limit: that limit. Sessions, and keys
                without their own limit, never receive it.
              schema:
                minimum: 0
                type: integer
            x-ratelimit-remaining:
              description: >-
                Requests left before this caller is limited: the per-address
                limit's when that limit counted the request, otherwise the API
                key's own remaining allowance. Absent when no finite limit
                counted the request.
              schema:
                minimum: 0
                type: integer
            x-ratelimit-reset:
              description: >-
                Sent with x-ratelimit-limit, only when the request's API key has
                its own limit: whole seconds until that allowance is full again.
              schema:
                minimum: 0
                type: integer
            x-request-id:
              description: >-
                The request's id: the caller's valid `X-Request-Id`, or a
                generated UUID v4. Quote it when asking for support.
              schema:
                type: string
        '413':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiError'
          description: The request body is too large.
          headers:
            x-ratelimit-limit:
              description: >-
                Sent only when the request's API key has its own
                requests-per-minute limit: that limit. Sessions, and keys
                without their own limit, never receive it.
              schema:
                minimum: 0
                type: integer
            x-ratelimit-remaining:
              description: >-
                Requests left before this caller is limited: the per-address
                limit's when that limit counted the request, otherwise the API
                key's own remaining allowance. Absent when no finite limit
                counted the request.
              schema:
                minimum: 0
                type: integer
            x-ratelimit-reset:
              description: >-
                Sent with x-ratelimit-limit, only when the request's API key has
                its own limit: whole seconds until that allowance is full again.
              schema:
                minimum: 0
                type: integer
            x-request-id:
              description: >-
                The request's id: the caller's valid `X-Request-Id`, or a
                generated UUID v4. Quote it when asking for support.
              schema:
                type: string
        '415':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiError'
          description: The request body must be sent as `application/json`.
          headers:
            x-ratelimit-limit:
              description: >-
                Sent only when the request's API key has its own
                requests-per-minute limit: that limit. Sessions, and keys
                without their own limit, never receive it.
              schema:
                minimum: 0
                type: integer
            x-ratelimit-remaining:
              description: >-
                Requests left before this caller is limited: the per-address
                limit's when that limit counted the request, otherwise the API
                key's own remaining allowance. Absent when no finite limit
                counted the request.
              schema:
                minimum: 0
                type: integer
            x-ratelimit-reset:
              description: >-
                Sent with x-ratelimit-limit, only when the request's API key has
                its own limit: whole seconds until that allowance is full again.
              schema:
                minimum: 0
                type: integer
            x-request-id:
              description: >-
                The request's id: the caller's valid `X-Request-Id`, or a
                generated UUID v4. Quote it when asking for support.
              schema:
                type: string
        '429':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiError'
          description: >-
            Too many requests. Wait the number of seconds in `Retry-After`
            before retrying.
          headers:
            Retry-After:
              description: >-
                Whole seconds to wait before retrying. Always sent on 429; sent
                on 503 when the wait is known. `details.retryAfter` carries the
                same wait as an ISO 8601 duration.
              schema:
                minimum: 0
                type: integer
            x-ratelimit-limit:
              description: >-
                Sent only when the request's API key has its own
                requests-per-minute limit: that limit. Sessions, and keys
                without their own limit, never receive it.
              schema:
                minimum: 0
                type: integer
            x-ratelimit-remaining:
              description: >-
                Requests left before this caller is limited: the per-address
                limit's when that limit counted the request, otherwise the API
                key's own remaining allowance. Absent when no finite limit
                counted the request.
              schema:
                minimum: 0
                type: integer
            x-ratelimit-reset:
              description: >-
                Sent with x-ratelimit-limit, only when the request's API key has
                its own limit: whole seconds until that allowance is full again.
              schema:
                minimum: 0
                type: integer
            x-request-id:
              description: >-
                The request's id: the caller's valid `X-Request-Id`, or a
                generated UUID v4. Quote it when asking for support.
              schema:
                type: string
        '500':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiError'
          description: Something went wrong on our side.
          headers:
            x-ratelimit-limit:
              description: >-
                Sent only when the request's API key has its own
                requests-per-minute limit: that limit. Sessions, and keys
                without their own limit, never receive it.
              schema:
                minimum: 0
                type: integer
            x-ratelimit-remaining:
              description: >-
                Requests left before this caller is limited: the per-address
                limit's when that limit counted the request, otherwise the API
                key's own remaining allowance. Absent when no finite limit
                counted the request.
              schema:
                minimum: 0
                type: integer
            x-ratelimit-reset:
              description: >-
                Sent with x-ratelimit-limit, only when the request's API key has
                its own limit: whole seconds until that allowance is full again.
              schema:
                minimum: 0
                type: integer
            x-request-id:
              description: >-
                The request's id: the caller's valid `X-Request-Id`, or a
                generated UUID v4. Quote it when asking for support.
              schema:
                type: string
        '503':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiError'
          description: >-
            The service is temporarily unavailable. When `Retry-After` is sent,
            wait that many seconds before retrying.
          headers:
            Retry-After:
              description: >-
                Whole seconds to wait before retrying. Always sent on 429; sent
                on 503 when the wait is known. `details.retryAfter` carries the
                same wait as an ISO 8601 duration.
              schema:
                minimum: 0
                type: integer
            x-ratelimit-limit:
              description: >-
                Sent only when the request's API key has its own
                requests-per-minute limit: that limit. Sessions, and keys
                without their own limit, never receive it.
              schema:
                minimum: 0
                type: integer
            x-ratelimit-remaining:
              description: >-
                Requests left before this caller is limited: the per-address
                limit's when that limit counted the request, otherwise the API
                key's own remaining allowance. Absent when no finite limit
                counted the request.
              schema:
                minimum: 0
                type: integer
            x-ratelimit-reset:
              description: >-
                Sent with x-ratelimit-limit, only when the request's API key has
                its own limit: whole seconds until that allowance is full again.
              schema:
                minimum: 0
                type: integer
            x-request-id:
              description: >-
                The request's id: the caller's valid `X-Request-Id`, or a
                generated UUID v4. Quote it when asking for support.
              schema:
                type: string
      security:
        - bearer_auth: []
        - api_key: []
components:
  parameters:
    WorkspaceId:
      description: >-
        The workspace the request acts in. An API key bound to a workspace
        implies it: omit the header, or send that same id (another id answers
        403 WORKSPACE_SCOPE_MISMATCH). A member session must send it (400
        MISSING_WORKSPACE without it).
      in: header
      name: X-Workspace-Id
      required: false
      schema:
        format: uuid
        type: string
  schemas:
    UpdateWebhookRequest:
      additionalProperties: false
      description: >-
        Partial update of a webhook endpoint. Omitted fields retain their
        current values.
      properties:
        active:
          type:
            - boolean
            - 'null'
        events:
          items:
            type: string
          type:
            - array
            - 'null'
        url:
          type:
            - string
            - 'null'
      type: object
    WebhookConfig:
      description: A webhook configuration for a workspace.
      properties:
        active:
          type: boolean
        consecutiveFailures:
          description: |-
            Count of consecutive full-retry-schedule failures. Reset to 0 on any
            successful delivery. Reaching 5 pauses the subscription.
          format: int32
          type: integer
        createdAt:
          format: date-time
          type: string
        events:
          items:
            $ref: '#/components/schemas/WebhookEventType'
          type: array
        id:
          type: string
        pausedAt:
          description: |-
            Set when the subscription is auto-paused after persistent delivery
            failure. Cleared when the subscription is reactivated.
          format: date-time
          type:
            - string
            - 'null'
        updatedAt:
          format: date-time
          type: string
        url:
          type: string
        workspaceId:
          type: string
      required:
        - id
        - workspaceId
        - url
        - events
        - active
        - createdAt
        - updatedAt
      type: object
    ApiError:
      description: >-
        A refusal of an integrator operation. Codes are an open set: a client
        handles the codes it

        knows and falls back on the HTTP status for any other.
      properties:
        details:
          oneOf:
            - type: 'null'
            - $ref: '#/components/schemas/ApiErrorDetails'
        docUrl:
          description: Stable documentation for this refusal code.
          type: string
        error:
          description: The machine-readable code, for example `QUOTE_EXPIRED`.
          type: string
        message:
          description: What happened, in words a person can read. Not for matching.
          type: string
        next:
          oneOf:
            - type: 'null'
            - $ref: '#/components/schemas/QuoteNextAction'
              description: >-
                The way forward, when there is one (for example `requote` on an
                expired quote).
        requestId:
          description: >-
            The request's id, the value the `X-Request-Id` response header
            carries. Quote it when

            asking for support.
          type:
            - string
            - 'null'
        retryable:
          description: >-
            Whether an unchanged request may succeed later, from the error
            catalogue.
          type: boolean
        timestamp:
          description: When the refusal was made, in Unix seconds.
          format: int64
          type: integer
      required:
        - error
        - docUrl
        - retryable
        - message
        - timestamp
      type: object
    WebhookEventType:
      description: New values may be added; treat unknown values as other.
      enum:
        - treasury.payout.awaiting_approval
        - treasury.payout.completed
        - treasury.payout.failed
        - treasury.payout.cancelled
        - treasury.fiat_leg.planned
        - treasury.fiat_leg.awaiting_approval
        - treasury.fiat_leg.payout_held
        - treasury.fiat_leg.dispatching
        - treasury.fiat_leg.uncertain
        - treasury.fiat_leg.in_transit
        - treasury.fiat_leg.held_by_provider
        - treasury.fiat_leg.overdue
        - treasury.fiat_leg.manual_review
        - treasury.fiat_leg.settled
        - treasury.fiat_leg.returned
        - treasury.fiat_leg.returned_after_settlement
        - treasury.fiat_leg.refunding
        - treasury.fiat_leg.refunded
        - treasury.fiat_leg.cancelled
        - treasury.fiat_leg.refused
        - treasury.bank_deposit.declared
        - treasury.bank_deposit.overdue
        - treasury.bank_deposit.manual_review
        - treasury.bank_deposit.credited
        - treasury.bank_deposit.withdrawn_by_user
        - treasury.bank_deposit.history_unreadable
        - treasury.bank_deposit.history_recovered
        - treasury.fiat_leg.awaiting_funds
        - treasury.fiat_leg.funds_received
        - treasury.fiat_leg.price_beyond_bound
        - treasury.fiat_leg.expired_unfunded
        - treasury.fiat_leg.late_funds
        - treasury.transfer.submitted
        - treasury.transfer.awaiting_approval
        - treasury.transfer.rejected
        - treasury.transfer.completed
        - treasury.transfer.failed
        - treasury.transfer.cancelled
        - treasury.transfer.custodian_approval_relayed
        - treasury.transfer.expired
        - treasury.transfer.replaced
        - treasury.transfer.confirmation_threshold_set
        - treasury.run.draft
        - treasury.run.waiting_for_funds
        - treasury.run.awaiting_approval
        - treasury.run.ready
        - treasury.run.running
        - treasury.run.waiting
        - treasury.run.reconciling
        - treasury.run.needs_review
        - treasury.run.paused
        - treasury.run.succeeded
        - treasury.run.partially_succeeded
        - treasury.run.failed
        - treasury.run.recovering
        - treasury.run.recovered
        - treasury.run.cancelled
        - treasury.step.pending
        - treasury.step.ready
        - treasury.step.dispatching
        - treasury.step.waiting
        - treasury.step.reconciling
        - treasury.step.needs_review
        - treasury.step.paused
        - treasury.step.succeeded
        - treasury.step.partially_succeeded
        - treasury.step.failed
        - treasury.step.cancelled
        - treasury.step.custodian_cancel_requested
        - treasury.step.confirmation_threshold_set
        - treasury.step.custodian_approval_relayed
        - treasury.step.custodian_cancel_overridden
        - treasury.approval.requested
        - treasury.approval.expiring
        - treasury.approval.approved
        - treasury.approval.denied
        - treasury.approval.expired
        - treasury.destination.retired
        - treasury.address_book.destination_revoked
        - treasury.workspace.frozen
        - treasury.vault.frozen
        - treasury.custodian.frozen
        - treasury.balance.low
        - treasury.balance.recovered
        - treasury.statement.ready
        - treasury.automation.created
        - treasury.automation.updated
        - treasury.automation.activated
        - treasury.automation.returned_to_review
        - treasury.automation.paused
        - treasury.automation.resumed
        - treasury.automation.archived
        - treasury.agent.envelope.created
        - treasury.agent.envelope.updated
        - treasury.agent.kill_switch.activated
        - treasury.agent.session_signer.granted
        - treasury.agent.session_signer.revoked
        - treasury.agent.sponsor.changed
        - treasury.agent.rebalancer.run
        - treasury.agent.payment.authorized
        - treasury.agent.payment.settled
        - treasury.agent.payment.refused
        - treasury.agent.payment.received
        - order.updated
        - settlement.failed
        - settlement.retried
        - settlement.disputed
        - member.invited
        - member.joined
        - member.added
        - member.removed
        - api_key.rotated
        - api_key.revoked
        - api_key.expiring_soon
        - lp.enabled
        - lp.disabled
        - lp.sla_breach
        - kyb.expiring
        - kyb.expired
        - kyb.renewed
        - kyc.expiring
        - compliance.sanctions.flag_added
        - compliance.event
        - credit.updated
        - affiliation.invited
        - affiliation.accepted
        - affiliation.revoked
        - bilateral.requested
        - bilateral.accepted
        - direct_user.created
        - direct_user.updated
        - direct_user.invited
        - direct_user.suspended
        - direct_user.verification.pending
        - direct_user.verification.verified
        - direct_user.verification.rejected
        - wallet.session_signer.granted
        - wallet.session_signer.revoked
        - webhook.subscription.paused
        - webhook.test
      type: string
      x-extensible-enum: true
    ApiErrorDetails:
      additionalProperties:
        description: >-
          Any further detail the code carries (for example `stepUpSubject`,
          `balanceShortfall`,

          `minimumAmount`), each named in camelCase.
      description: >-
        The code's detail. Each field is present only on the codes named beside
        it; other codes may

        carry further fields, named in camelCase, which a client may ignore.
      properties:
        capabilityBlockers:
          description: >-
            `CAPABILITY_BLOCKED` and the other capability refusals: what blocks
            the workspace.
          items:
            $ref: '#/components/schemas/CapabilityBlocker'
          type:
            - array
            - 'null'
        conflicts:
          description: '`REQUOTE_FIELDS_CONFLICT`: the fields that cannot go with `requote`.'
          items:
            type: string
          type:
            - array
            - 'null'
        field:
          description: '`INVALID_REQUEST` (out of range): the field.'
          type:
            - string
            - 'null'
        reason:
          description: >-
            A machine-readable reason token the refusing step gave.


            Known source reason tokens (not all apply to every status):
            `adapterPayloadSerializationFailed`,
            `basicVenueAccountsUnavailable`, `billingPaymentOverdue`,
            `walletNotOnChain`, `ccxtVenueRequiresCexLane`,
            `executionStageDisabled`, `jurisdictionUnproven`,
            `onboardedVenuesUnavailable`, `onchainAccountDefaultWalletRequired`,
            `onchainAccountDefaultWalletUnavailable`,
            `onchainAccountWalletRequired`, `onchainAssetDecimalsMismatch`,
            `onchainAssetIdentityMismatch`, `onchainAssetUnmapped`,
            `onchainAssetVariantFiltered`, `onchainWalletUnavailable`,
            `onchainCatalogueUnavailable`, `onchainDeliverToNotReceivingWallet`,
            `onchainDeliverToUnverified`, `onchainMarketsUnavailable`,
            `onchainMarketCatalogUnreadable`, `onchainMarketChainRequired`,
            `onchainMarketVariantRequired`, `onchainMarketTokenRequired`,
            `onchainSiteChainUnreadable`, `onchainWalletChainUnreadable`,
            `onchainWalletInactive`, `onchainWalletNotLinked`,
            `onchainWalletNotUsable`, `onchainWalletPickAmbiguous`,
            `onchainWalletWrongNetwork`, `payeeDeliveryUnsupported`,
            `signerLacksRight`, `signerUnavailable`, `signingGrantAmbiguous`,
            `signingGrantExpired`, `signingGrantRequired`,
            `signingGrantTokenNotKept`, `signingGrantTokenNotPayable`,
            `solverChainUnready`, `walletChainMismatch`, `walletNotUsableByYou`,
            `walletNotVerifiedForAce`, `walletNotWhitelisted`,
            `withdrawalChainUnsupported`, `accountFeeUnavailable`,
            `comparisonCostsUnavailable`, `connectionListingUnavailable`,
            `feeUnverified`, `noPool`, `noPrice`, `noSize`, `notFilled`,
            `notYetPublished`, `priceArithmetic`, `priceSourceNone`,
            `referenceMidUnavailable`, `settlementPrecisionUnavailable`,
            `accountSetupIncomplete`, `admissionUnavailable`,
            `advancedAccountEligibilityUnavailable`,
            `advancedAccountStateInconsistent`, `advancedConnectionDisabled`,
            `advancedConnectionNotConfigured`, `advancedConnectionPaused`,
            `advancedSettlementNeedsVerification`, `advancedModeDisabled`,
            `advancedNotAvailableForAccount`, `advancedNotEnabledForAccount`,
            `allowanceUnavailable`, `acrossCapacityExceeded`,
            `relayCapacityExceeded`, `acrossChainNotCarried`,
            `cctpChainNotCarried`, `relayChainNotCarried`,
            `apiKeyAdvancedWalletUnsupported`,
            `apiKeyOrganisationWalletScopeRequired`, `grantCapExceeded`,
            `amountAboveMaximum`, `amountBelowMinimum`, `amountUnreadable`,
            `amountsUnreadable`, `askFirst`, `authorityUnavailable`,
            `automationNeverAsks`, `availabilityUnreadable`,
            `backgroundNeverAsks`, `balanceUnreadable`, `defaultsUnavailable`,
            `walletHasNoAddress`, `walletUnavailable`, `bondAmountUnreadable`,
            `bondAssetUnreadable`, `catalogueUnavailable`, `chainFamilyUnknown`,
            `chainUnrecorded`, `clientSessionRequired`, `clockUnreadable`,
            `comingSoon`, `connectionChanged`, `connectionRevoked`,
            `corridorInvalid`, `credential`, `deadlineExceeded`,
            `defaultsLoading`, `deliverToCalldataUnsupported`,
            `deliverToTagUnsupported`, `deliverToNotPermitted`,
            `deliverToUnreadable`, `tradingPermissionRequired`,
            `directPatienceHarvest`, `economicallyInferior`,
            `exactAmountConflictsWithCard`, `exactAmountConflictsWithQuote`,
            `exactOutputDeliveryUnsupported`, `exactOutputEstimateUnavailable`,
            `exactRouteHypothesisUnavailable`, `expiredOnArrival`,
            `expiryUnknown`, `feeUnreadable`, `filteredOut`, `firmAskRefused`,
            `freshnessUnknown`, `fundingWindow`, `insufficientLiquidity`,
            `venueRelationship`, `venueRelationshipUnavailable`, `lpUnknown`,
            `mfaEnrolmentRequired`, `mfaRequired`, `minimumUnverified`,
            `mixedNetworks`, `netReceivedUnavailable`, `networkUnrecorded`,
            `noAddress`, `noCard`, `noFetcher`, `noInventory`, `noLaneForPair`,
            `noLegs`, `noOnChainCorridor`, `noPlannedVenue`, `noQuote`, `noRpc`,
            `notConnected`, `notEligible`, `notExecutable`,
            `orderPayloadMissing`, `outsideTopComposites`, `pairUnmapped`,
            `sellChainInvalid`, `permissionsUnreadable`,
            `placeOrderNotPermitted`, `prefundingMarkerUnreadable`,
            `prefundingRequired`, `indicative`, `priceOnRequest`,
            `priceOutOfRange`, `priceProtectionInvalid`, `pricingBookOnly`,
            `productNotQuoted`, `protocolChainMissing`,
            `providerFeeTreatmentUnknown`, `providerSiteUnrecorded`,
            `quoteIdUnissuable`, `quoteNotHeld`, `buyChainInvalid`,
            `buyAmountUnsupported`, `exactOutputDebitUnavailable`,
            `pairNotServed`, `receiveWalletNotServed`, `referenceMidUnreadable`,
            `referencePriceUnavailable`, `registryUnavailable`,
            `releaseRecheckUnavailable`, `requestUnbuildable`,
            `routeLegChainUnknown`, `routeLegUnnamed`, `routeLegUnplanned`,
            `routeUnavailable`, `secondFactorUnreadable`, `shortfallUnmeasured`,
            `shortfallUnreadable`, `singleChainVenue`, `siteChainUnreadable`,
            `sizeNotEligible`, `submitOrderBlocked`,
            `takerOnboardingIncomplete`, `tierNotQuoted`, `tradePaused`,
            `unsupportedNative`, `venueConnectionStorageUnavailable`,
            `venueDataStale`, `venueDeclined`, `venueNotConnected`,
            `venueNotEnabledForWorkspace`, `venueNotListed`,
            `venueTradeKeyUnavailable`, `venueTradeScopeRequired`,
            `venueTradeUnreadable`, `venueUnavailable`, `walletRefused`,
            `withdrawalFeeUnread`, `acrossRoutedViaCctp`,
            `apiKeyOrganisationWalletNotAllowlisted`,
            `balanceAvailabilityUnconfirmed`, `bankDestinationUnavailable`,
            `bebopJamKeyNotEnabled`, `bebopJamQuoteDeclined`,
            `bebopTokenUnavailable`, `relayCurrencyUnsupported`,
            `relaySwapImpactTooHigh`, `tetrafiSolverCallbackNotAuthorized`,
            `tradingLinkSnapshotChanged`, `tradingLinkSnapshotUnavailable`,
            `uniswapChainReadUnavailable`, `uniswapInsufficientDepth`,
            `uniswapQuoteUnreadable`, `uniswapUnwrapAboveDailyCap`,
            `uniswapUnwrapAboveTradeCap`, `uniswapRouteNotGranted`,
            `venueNotEnabled`, `askLimitReached`, `balanceMeaningUnconfirmed`,
            `bebopJamWalletUnsupported`, `bebopQuorumWalletTooSlow`,
            `bebopWalletQuorumUnreadable`, `connectionNotConfigured`,
            `deliveryAccountNetworkUnavailable`, `deliveryAccountUnavailable`,
            `destinationCannotSendOnChain`, `dexReferencePriceUnavailable`,
            `firmQuoteLimited`, `fundingAccountNetworkUnavailable`,
            `fundingAccountUnavailable`, `insufficientDepth`,
            `missingPermission`, `needsNativeGas`, `needsWallet`, `notPriced`,
            `payInTermsUnavailable`, `pilotTradeCapExceeded`,
            `platformFeeRateUnavailable`, `pricingBookPairUnserved`,
            `settlementDeclarationUnavailable`, `settlementNotAvailable`,
            `timedOut`, `timedOutBeforeSend`, `tradingSourceNetworkUnavailable`,
            `tradingSourceNotLinked`, `venueEnablementRechecking`,
            `venueEnablementUnavailable`, `venueListingTimedOut`,
            `venuePoliciesUnavailable`.


            New values may be added; treat unknown values as other.
          type:
            - string
            - 'null'
        remediation:
          description: A machine-readable recovery hint the refusing step gave.
          type:
            - string
            - 'null'
        retryAfter:
          oneOf:
            - type: 'null'
            - $ref: '#/components/schemas/IsoDuration'
              description: >-
                Every `429`, and a `503` that knows: when to try again, as an
                ISO 8601 duration. The

                `Retry-After` header carries the same wait in whole seconds.
        value:
          description: >-
            `UNKNOWN_ASSET`, `UNKNOWN_CHAIN`, `UNKNOWN_VENUE`, `INVALID_AMOUNT`:
            the value refused;

            `ASSET_NOT_ON_CHAIN`: the pinned chain the Asset is not on.
          type:
            - string
            - 'null'
      type: object
    QuoteNextAction:
      description: |-
        The one action the caller takes next; later legs run
        under the order.

        New values may be added; treat unknown values as other.
      discriminator:
        propertyName: kind
      oneOf:
        - description: '`POST /orders {quoteId}`.'
          properties:
            kind:
              description: New values may be added; treat unknown values as other.
              enum:
                - order
              type: string
              x-extensible-enum: true
          required:
            - kind
          type: object
        - description: >-
            `POST /orders/preflight`: the held terms may need an approval,
            allowance or

            receipt the server cannot confirm from memory. Its response carries
            the next step.
          properties:
            kind:
              description: New values may be added; treat unknown values as other.
              enum:
                - preflight
              type: string
              x-extensible-enum: true
          required:
            - kind
          type: object
        - description: Send these transactions, then order.
          properties:
            kind:
              description: New values may be added; treat unknown values as other.
              enum:
                - transact
              type: string
              x-extensible-enum: true
            transactions:
              items:
                $ref: '#/components/schemas/TakerTransaction'
              type: array
          required:
            - transactions
            - kind
          type: object
        - description: Sign this EIP-712 document, then order.
          properties:
            kind:
              description: New values may be added; treat unknown values as other.
              enum:
                - sign
              type: string
              x-extensible-enum: true
            typedData: {}
          required:
            - typedData
            - kind
          type: object
        - description: >-
            Fund, then requote. `null` instructions when they could not be read;
            no order is

            accepted while short either way.
          properties:
            instructions:
              oneOf:
                - type: 'null'
                - $ref: '#/components/schemas/FundInstructions'
            kind:
              description: New values may be added; treat unknown values as other.
              enum:
                - fund
              type: string
              x-extensible-enum: true
          required:
            - kind
          type: object
        - description: Ask the venue again, with these Binding slots filled.
          properties:
            kind:
              description: New values may be added; treat unknown values as other.
              enum:
                - requote
              type: string
              x-extensible-enum: true
            needs:
              items:
                $ref: '#/components/schemas/RequoteNeed'
              type: array
          required:
            - needs
            - kind
          type: object
        - description: >-
            Search again: `POST /quotes` with a pair body. The quote is past its
            requote window,

            so `{requote: quoteId}` can no longer refresh it.
          properties:
            kind:
              description: New values may be added; treat unknown values as other.
              enum:
                - search
              type: string
              x-extensible-enum: true
          required:
            - kind
          type: object
        - description: >-
            The venue outcome is being reconciled. Read this same order again
            after

            the given ISO 8601 duration; never submit a replacement order.
          properties:
            kind:
              description: New values may be added; treat unknown values as other.
              enum:
                - wait
              type: string
              x-extensible-enum: true
            retryAfter:
              $ref: '#/components/schemas/IsoDuration'
          required:
            - retryAfter
            - kind
          type: object
        - description: Contact support with this non-secret order reference.
          properties:
            kind:
              description: New values may be added; treat unknown values as other.
              enum:
                - contact
              type: string
              x-extensible-enum: true
            reference:
              type: string
          required:
            - reference
            - kind
          type: object
      x-extensible-enum: true
    CapabilityBlocker:
      description: One reason a capability is blocked, plus the step that unlocks it.
      properties:
        code:
          $ref: '#/components/schemas/CapabilityBlockerCode'
        currentlyDue:
          description: |-
            Requirement keys still due, such as `kyb_review`, `actor_kyc` or
            `permission:place_order`. Empty when nothing specific is due.
          items:
            type: string
          type: array
        estimate:
          $ref: '#/components/schemas/CapabilityUnlockEstimate'
        message:
          type: string
        unlockStep:
          $ref: '#/components/schemas/CapabilityUnlockStep'
          description: >-
            Stable key of the step that unlocks this blocker. The UI maps it to
            a

            route or dialog.
      required:
        - code
        - message
        - unlockStep
        - estimate
      type: object
    IsoDuration:
      description: An ISO 8601 duration, e.g. PT3S or PT2M.
      examples:
        - PT120S
      format: duration
      pattern: >-
        ^PT(?:[0-9]+H(?:[0-9]+M)?(?:[0-9]+(?:\.[0-9]{1,3})?S)?|[0-9]+M(?:[0-9]+(?:\.[0-9]{1,3})?S)?|[0-9]+(?:\.[0-9]{1,3})?S)$
      type: string
    TakerTransaction:
      description: One transaction the Taker sends itself (an approval included).
      properties:
        chain:
          $ref: '#/components/schemas/Caip2Chain'
        data:
          description: Hex calldata (`0x…`).
          type: string
        to:
          type: string
        value:
          description: Native value in base units, as a decimal string.
          type: string
      required:
        - chain
        - data
        - to
        - value
      type: object
    FundInstructions:
      description: >-
        What to fund and how. Bank funding carries only a privacy-safe summary
        and a

        non-bearer reference to the separately authorized reveal read.


        New values may be added; treat unknown values as other.
      discriminator:
        propertyName: kind
      oneOf:
        - properties:
            address:
              type: string
            asset:
              type: string
            chainRef:
              type: string
            expiresAt:
              format: date-time
              type: string
            kind:
              description: New values may be added; treat unknown values as other.
              enum:
                - venueDeposit
              type: string
              x-extensible-enum: true
            memo:
              type:
                - string
                - 'null'
            networkCode:
              type: string
            networkConfirmed:
              description: >-
                False when the venue reports no network for this address:
                `networkCode`

                is empty and `chainRef` is the caller's selection, which the
                customer

                must confirm with the venue before sending.
              type: boolean
            observedAt:
              format: date-time
              type: string
            tokenContract:
              type: string
          required:
            - asset
            - chainRef
            - networkCode
            - networkConfirmed
            - address
            - tokenContract
            - observedAt
            - expiresAt
            - kind
          type: object
        - description: >-
            The only bank-deposit payload allowed in an asset-pair quote,
            request readback or

            copied durable/evidence body. It carries no receiving coordinates or
            payment memo.

            Fund, then explicitly requote; this summary never authorizes a
            transfer or order.
          properties:
            accountLast4:
              oneOf:
                - type: 'null'
                - $ref: '#/components/schemas/BankAccountSuffix'
                  description: >-
                    An already-qualified masked suffix, not external account
                    ownership proof.
            amount:
              $ref: '#/components/schemas/DecimalAmount'
            bankDisplayName:
              type:
                - string
                - 'null'
            expiresAt:
              description: >-
                UTC ISO instant, or null when expiry is UNKNOWN. Null never
                means no expiry.
              format: date-time
              type:
                - string
                - 'null'
            kind:
              description: New values may be added; treat unknown values as other.
              enum:
                - bankDeposit
              type: string
              x-extensible-enum: true
            revealRef:
              $ref: '#/components/schemas/BankFundingRevealRef'
          required:
            - accountLast4
            - amount
            - bankDisplayName
            - expiresAt
            - kind
            - revealRef
          type: object
        - description: >-
            The quote's own bound pay wallet (an organisation wallet on a Basic
            on-chain

            venue account) holds less than the trade debits: send `amount` of
            `asset` to

            `address` on `chain`, then get a new price. `walletId` is the
            binding target the

            source's `topUp` fix names; `tokenContract` is the registry's
            deployment address

            of `asset` on `chain` (the zero address for the chain's native
            coin).
          properties:
            address:
              type: string
            amount:
              $ref: '#/components/schemas/DecimalAmount'
            asset:
              $ref: '#/components/schemas/AssetId'
            chain:
              $ref: '#/components/schemas/Caip2Chain'
            kind:
              description: New values may be added; treat unknown values as other.
              enum:
                - walletTopUp
              type: string
              x-extensible-enum: true
            tokenContract:
              type: string
            walletId:
              type: string
          required:
            - walletId
            - address
            - chain
            - asset
            - tokenContract
            - amount
            - kind
          type: object
        - description: Native gas for a transaction the Taker sends itself.
          properties:
            amount:
              $ref: '#/components/schemas/DecimalAmount'
            asset:
              $ref: '#/components/schemas/AssetId'
            chain:
              $ref: '#/components/schemas/Caip2Chain'
            kind:
              description: New values may be added; treat unknown values as other.
              enum:
                - nativeGas
              type: string
              x-extensible-enum: true
          required:
            - chain
            - amount
            - asset
            - kind
          type: object
        - description: >-
            A bank-funded venue account is short and deposit first isn't offered
            on it:

            its bank side declares no deposit instructions, or nothing that

            credits a declared deposit. The account is funded from its own
            funding details,

            then the quote is asked again. `amount` is the shortfall in
            `currency`;

            `connectionId` is the venue account to fund; `reason` is the venue's
            declared

            sentence for why ("Keyrock gives no deposit reference for bank
            transfers, so

            TetraFi can't tell your deposit apart"), product copy without a
            final period.
          properties:
            amount:
              $ref: '#/components/schemas/DecimalAmount'
            connectionId:
              type: string
            currency:
              type: string
            kind:
              description: New values may be added; treat unknown values as other.
              enum:
                - depositFirstNotOffered
              type: string
              x-extensible-enum: true
            reason:
              type: string
          required:
            - connectionId
            - amount
            - currency
            - reason
            - kind
          type: object
      x-extensible-enum: true
    RequoteNeed:
      description: >-
        A Binding slot a requote needs filled. An empty `needs` means requote as
        is.


        New values may be added; treat unknown values as other.
      enum:
        - wallet:evm
        - wallet:solana
        - wallet:tron
        - account
        - bankAccount
        - deliverTo
      type: string
      x-extensible-enum: true
    CapabilityBlockerCode:
      description: |-
        Stable machine-readable blocker codes returned by the capability gate.

        New values may be added; treat unknown values as other.
      enum:
        - WORKSPACE_NOT_FOUND
        - WORKSPACE_NOT_ACTIVE
        - WORKSPACE_SUSPENDED
        - PARENT_WORKSPACE_INACTIVE
        - INSUFFICIENT_PERMISSION
        - WORKSPACE_TYPE_UNSUPPORTED
        - BASE_PROFILE_INCOMPLETE
        - BASE_PROFILE_UNREADABLE
        - KYB_NOT_VERIFIED
        - KYC_NOT_VERIFIED
        - SANCTIONS_FLAGGED
        - MEMBER_COMPLIANCE_FROZEN
        - MEMBER_COMPLIANCE_DENIED
        - SCREENING_PENDING
        - SCREENING_UNAVAILABLE
        - GEO_RESTRICTED
        - WALLET_NOT_VERIFIED
        - DIRECT_USER_NOT_FOUND
        - DIRECT_USER_SUSPENDED
        - DIRECT_USER_KYC_NOT_VERIFIED
        - INSUFFICIENT_SCOPE
        - TREASURY_DISABLED
        - NO_USABLE_CREDENTIAL
        - CROSS_OWNER_WRITE_DENIED
        - AGGREGATE_SCOPE_READ_ONLY
        - OWNER_SCOPE_REQUIRED
        - VENUE_OPERATION_UNSUPPORTED
        - TAKER_ONBOARDING_INCOMPLETE
        - TAKER_ADMISSION_UNAVAILABLE
      type: string
      x-extensible-enum: true
    CapabilityUnlockEstimate:
      description: >-
        Coarse time-to-unlock class. The UI owns the copy; figures are
        engineering

        estimates until the KYB queue and Sumsub webhooks supply measured
        values.


        New values may be added; treat unknown values as other.
      enum:
        - minutes
        - forms_then_review
        - admin_action
        - other_party
        - unknown
        - not_unlockable
      type: string
      x-extensible-enum: true
    CapabilityUnlockStep:
      description: |-
        Stable key for the step that unlocks a blocked capability. The backend
        names the step; the UI owns the step-to-route map. Never a UI route.

        New values may be added; treat unknown values as other.
      enum:
        - finish_onboarding
        - company_details
        - kyb_profile
        - kyc_dialog
        - link_wallet
        - ask_admin
        - contact_broker
        - manage_direct_users
        - manage_api_key
        - connect_custodian
        - switch_account_scope
        - contact_support
        - await_screening
        - none
      type: string
      x-extensible-enum: true
    Caip2Chain:
      description: >-
        A CAIP-2 chain id (`eip155:8453`, `solana:<genesis>`, `tron:shasta`),
        syntax-checked:

        a namespace of 3 to 8 lowercase letters, digits or `-`, and a reference
        of 1 to 32

        letters, digits, `-` or `_`. Compared exactly, as CAIP-2 references are
        case-sensitive.
      example: eip155:8453
      type: string
    BankAccountSuffix:
      description: >-
        An already-qualified masked account suffix of 1 to 4 ASCII
        letters/digits, not external account ownership proof. Never truncate a
        full account number.
      examples:
        - A1b2
      maxLength: 4
      minLength: 1
      pattern: ^[A-Za-z0-9]{1,4}$
      type: string
    DecimalAmount:
      description: >-
        A non-negative decimal string in Asset units (`"10000"`, `"9994.0"`):
        digits with an

        optional fraction, no sign, exponent or leading zero. Never a float and
        never base

        units. A request amount must also be positive (`INVALID_AMOUNT`); a fee
        or a

        known balance may be zero.
      example: '10000'
      type: string
    BankFundingRevealRef:
      description: >-
        Non-bearer lookup metadata for deposit instructions. Possession grants
        no authority. Each reveal requires current wallet-view authority and
        exact account membership; an API key additionally needs treasury_read.
        Missing and foreign accounts share a refusal. Quotes never fetch these
        instructions.
      properties:
        connectionId:
          description: >-
            The native held leg's exact connection id, never a
            first/sole-connection guess.
          type: string
        currency:
          type: string
        providerBankId:
          description: >-
            The provider's linked-bank id when required by that venue; otherwise
            unknown/null.
          type:
            - string
            - 'null'
      required:
        - connectionId
        - currency
        - providerBankId
      type: object
    AssetId:
      description: >-
        A registry Asset id (`USDC`, `USDe`). Matched case-insensitively against
        the catalogue,

        which answers it in the registry's own spelling.
      example: USDC
      type: string
  securitySchemes:
    api_key:
      description: >-
        Send the API key in `X-API-Key`.


        **Request signing.** A key with signing enabled (`POST
        /api/v1/workspaces/{workspaceId}/users/me/api-keys/{keyId}/signing`,
        which returns the signing secret once) must also sign every request:


        - `X-Timestamp`: the current Unix time in seconds, within 300 seconds of
        the server clock.

        - `X-Signature`: lower-case hex HMAC-SHA256 of the canonical string,
        keyed with the signing secret's 32 bytes (the secret is 64 hex
        characters; decode it first).


        The canonical string is four lines joined by `\n`, with no trailing
        newline: the `X-Timestamp` value, the upper-case method, the path with
        its query exactly as sent (`/api/v1/orders?limit=1`), and the lower-case
        hex SHA-256 of the exact body bytes (the SHA-256 of an empty body when
        there is none).


        A write's signature (POST, PUT, PATCH, DELETE) is accepted once: sending
        the same signed write again is refused, so a retry signs again. A read
        (GET, HEAD) changes nothing, so an identical signed read inside the
        window is admitted again and polling needs no nonce.


        A signing refusal is a 401 `AUTH_REQUIRED` whose `details.reason` names
        the cause: `SIGNATURE_REQUIRED` (a header is missing),
        `SIGNATURE_INVALID` (a malformed header or a wrong signature),
        `TIMESTAMP_OUT_OF_RANGE` or `SIGNATURE_REPLAYED`.
      in: header
      name: X-API-Key
      type: apiKey
      x-request-signing:
        algorithm: HMAC-SHA256
        canonicalRequest:
          - timestamp
          - method
          - pathWithQuery
          - bodySha256Hex
        canonicalSeparator: |+

        oneTimeMethods:
          - POST
          - PUT
          - PATCH
          - DELETE
        refusal:
          error: AUTH_REQUIRED
          reasons:
            - SIGNATURE_REQUIRED
            - SIGNATURE_INVALID
            - TIMESTAMP_OUT_OF_RANGE
            - SIGNATURE_REPLAYED
          status: 401
        secretEncoding: hex
        signatureEncoding: hex-lower
        signatureHeader: X-Signature
        timestampHeader: X-Timestamp
        timestampWindowSeconds: 300
    bearer_auth:
      bearerFormat: JWT
      scheme: bearer
      type: http

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.