> ## 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.

# Send test delivery

> Trigger a webhook.test delivery signed with the same Standard Webhooks headers (webhook-id, webhook-timestamp, webhook-signature) as live events. Required API-key scope: `webhooks_manage`; the key's owner must still be allowed to manage webhooks. A member session needs permission to manage webhooks or credentials.



## OpenAPI

````yaml api-reference/openapi.json POST /api/v1/workspaces/{workspaceId}/webhooks/{webhookId}/deliveries
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:
  - description: Production. Uses real assets and venue accounts.
    url: https://api.tetrafi.io
  - description: >-
      Shared development sandbox backed by the dev testnet chain registry. Use
      testnet assets and your workspace's sandbox/testnet venue accounts; makers
      are not simulated. Credentials and workspaces are environment-specific.
    url: https://api-dev.tetrafi.io
security:
  - api_key: []
tags:
  - description: >-
      Exchange service-account credentials for a token, and read the credential
      you are calling with: its identity, scopes and rate limits.
    name: auth
  - description: >-
      Discover the assets, chains and venues you can trade, and read or stream
      their indicative prices.
    name: trading
  - description: >-
      Request firm or indicative quotes for an asset pair from every eligible
      venue, requote one, and read a quote request again.
    name: quotes
  - description: >-
      Place an order from a quote you hold, follow its status, and cancel it
      before it is sent to a venue.
    name: orders
  - description: >-
      Your trade history: every order and venue trade, with its settlement and
      settlement obligations.
    name: trades
  - description: >-
      Your venue accounts' settlement windows, obligations, movements and
      schedules, and the plan of what is due across them.
    name: settlements
  - description: Balances across the workspace's wallets and venue accounts.
    name: treasury
  - description: >-
      One venue account's balances, deposit instructions and history, credit and
      ledger.
    name: venue-accounts
  - description: >-
      The workspace's venue accounts, with where their funds are held and each
      venue's key state.
    name: venue-enablements
  - description: >-
      Register endpoints for signed event deliveries, rotate their secrets, send
      test deliveries and read the delivery log.
    name: webhooks
  - description: >-
      The workspace's verification state, the capabilities it allows, and its
      fee schedule.
    name: workspaces
  - description: >-
      Read up to 20 resources in one request, each answered exactly as its own
      GET.
    name: batch
paths:
  /api/v1/workspaces/{workspaceId}/webhooks/{webhookId}/deliveries:
    post:
      tags:
        - webhooks
      summary: Send a test delivery
      description: >-
        Trigger a webhook.test delivery signed with the same Standard Webhooks
        headers (webhook-id, webhook-timestamp, webhook-signature) as live
        events. Required API-key scope: `webhooks_manage`; the key's owner must
        still be allowed to manage webhooks. A member session needs permission
        to manage webhooks or credentials.
      operationId: test_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
        - description: >-
            Required. Same key and kind replay the stored 201 delivery without a
            second send; different body is 409 IDEMPOTENCY_CONFLICT.
          in: header
          name: Idempotency-Key
          required: true
          schema:
            type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateWebhookDeliveryRequest'
        required: true
      responses:
        '201':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WebhookDelivery'
          description: Test delivery created, or stored delivery replayed
          headers:
            Deprecation:
              description: >-
                Present when this operation is deprecated: an RFC 9745
                structured date, for example @1792443399. Absence makes no
                deprecation claim.
              schema:
                type: string
            Link:
              description: >-
                When deprecation applies, links to the deprecation notice with
                rel=deprecation; other link relations may also be sent.
              schema:
                type: string
            RateLimit:
              description: >-
                draft-ietf-httpapi-ratelimit-headers-07 section 3.1 structured
                dictionary, for example `limit=100, remaining=41, reset=19`.
                Remaining is the admitted decision's headroom; reset is whole
                seconds until quota next becomes available, not an epoch or a
                promise of a full burst refill. On a limiter's 429 remaining is
                0 and reset equals Retry-After. Accepted key, route and
                per-address policies are compared by lowest remaining, then
                longest reset. A venue refusal without a known quota makes no
                rate-limit header claim.
              schema:
                type: string
            RateLimit-Policy:
              description: >-
                draft-ietf-httpapi-ratelimit-headers-07 section 3.5: quota and
                window in seconds, for example `100;w=60`. Sent on every status
                when a finite limiter counted the request. The applicable policy
                closest to exhaustion is reported (section 3.2): lowest
                remaining, then longest reset. On a limiter's 429 this is
                exactly the policy that refused; if a venue discloses no quota,
                the headers are absent.
              schema:
                type: string
            Sunset:
              description: >-
                Present when retirement is scheduled: the HTTP-date after which
                this version may stop being served (RFC 8594).
              schema:
                type: string
            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 kind or Idempotency-Key
          headers:
            Deprecation:
              description: >-
                Present when this operation is deprecated: an RFC 9745
                structured date, for example @1792443399. Absence makes no
                deprecation claim.
              schema:
                type: string
            Link:
              description: >-
                When deprecation applies, links to the deprecation notice with
                rel=deprecation; other link relations may also be sent.
              schema:
                type: string
            RateLimit:
              description: >-
                draft-ietf-httpapi-ratelimit-headers-07 section 3.1 structured
                dictionary, for example `limit=100, remaining=41, reset=19`.
                Remaining is the admitted decision's headroom; reset is whole
                seconds until quota next becomes available, not an epoch or a
                promise of a full burst refill. On a limiter's 429 remaining is
                0 and reset equals Retry-After. Accepted key, route and
                per-address policies are compared by lowest remaining, then
                longest reset. A venue refusal without a known quota makes no
                rate-limit header claim.
              schema:
                type: string
            RateLimit-Policy:
              description: >-
                draft-ietf-httpapi-ratelimit-headers-07 section 3.5: quota and
                window in seconds, for example `100;w=60`. Sent on every status
                when a finite limiter counted the request. The applicable policy
                closest to exhaustion is reported (section 3.2): lowest
                remaining, then longest reset. On a limiter's 429 this is
                exactly the policy that refused; if a venue discloses no quota,
                the headers are absent.
              schema:
                type: string
            Sunset:
              description: >-
                Present when retirement is scheduled: the HTTP-date after which
                this version may stop being served (RFC 8594).
              schema:
                type: string
            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:
            Deprecation:
              description: >-
                Present when this operation is deprecated: an RFC 9745
                structured date, for example @1792443399. Absence makes no
                deprecation claim.
              schema:
                type: string
            Link:
              description: >-
                When deprecation applies, links to the deprecation notice with
                rel=deprecation; other link relations may also be sent.
              schema:
                type: string
            Sunset:
              description: >-
                Present when retirement is scheduled: the HTTP-date after which
                this version may stop being served (RFC 8594).
              schema:
                type: string
            WWW-Authenticate:
              description: >-
                Always sent on 401: `api_key, Bearer`, naming the `api_key`
                security scheme (X-API-Key and its HMAC request-signing
                contract) and the `bearer_auth` security scheme's HTTP scheme
                (Bearer). A presented bearer token adds `error="invalid_token"`
                to the Bearer challenge (RFC 6750 section 3).
              schema:
                type: string
            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:
            Deprecation:
              description: >-
                Present when this operation is deprecated: an RFC 9745
                structured date, for example @1792443399. Absence makes no
                deprecation claim.
              schema:
                type: string
            Link:
              description: >-
                When deprecation applies, links to the deprecation notice with
                rel=deprecation; other link relations may also be sent.
              schema:
                type: string
            RateLimit:
              description: >-
                draft-ietf-httpapi-ratelimit-headers-07 section 3.1 structured
                dictionary, for example `limit=100, remaining=41, reset=19`.
                Remaining is the admitted decision's headroom; reset is whole
                seconds until quota next becomes available, not an epoch or a
                promise of a full burst refill. On a limiter's 429 remaining is
                0 and reset equals Retry-After. Accepted key, route and
                per-address policies are compared by lowest remaining, then
                longest reset. A venue refusal without a known quota makes no
                rate-limit header claim.
              schema:
                type: string
            RateLimit-Policy:
              description: >-
                draft-ietf-httpapi-ratelimit-headers-07 section 3.5: quota and
                window in seconds, for example `100;w=60`. Sent on every status
                when a finite limiter counted the request. The applicable policy
                closest to exhaustion is reported (section 3.2): lowest
                remaining, then longest reset. On a limiter's 429 this is
                exactly the policy that refused; if a venue discloses no quota,
                the headers are absent.
              schema:
                type: string
            Sunset:
              description: >-
                Present when retirement is scheduled: the HTTP-date after which
                this version may stop being served (RFC 8594).
              schema:
                type: string
            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: Webhook not found
          headers:
            Deprecation:
              description: >-
                Present when this operation is deprecated: an RFC 9745
                structured date, for example @1792443399. Absence makes no
                deprecation claim.
              schema:
                type: string
            Link:
              description: >-
                When deprecation applies, links to the deprecation notice with
                rel=deprecation; other link relations may also be sent.
              schema:
                type: string
            RateLimit:
              description: >-
                draft-ietf-httpapi-ratelimit-headers-07 section 3.1 structured
                dictionary, for example `limit=100, remaining=41, reset=19`.
                Remaining is the admitted decision's headroom; reset is whole
                seconds until quota next becomes available, not an epoch or a
                promise of a full burst refill. On a limiter's 429 remaining is
                0 and reset equals Retry-After. Accepted key, route and
                per-address policies are compared by lowest remaining, then
                longest reset. A venue refusal without a known quota makes no
                rate-limit header claim.
              schema:
                type: string
            RateLimit-Policy:
              description: >-
                draft-ietf-httpapi-ratelimit-headers-07 section 3.5: quota and
                window in seconds, for example `100;w=60`. Sent on every status
                when a finite limiter counted the request. The applicable policy
                closest to exhaustion is reported (section 3.2): lowest
                remaining, then longest reset. On a limiter's 429 this is
                exactly the policy that refused; if a venue discloses no quota,
                the headers are absent.
              schema:
                type: string
            Sunset:
              description: >-
                Present when retirement is scheduled: the HTTP-date after which
                this version may stop being served (RFC 8594).
              schema:
                type: string
            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:
            Deprecation:
              description: >-
                Present when this operation is deprecated: an RFC 9745
                structured date, for example @1792443399. Absence makes no
                deprecation claim.
              schema:
                type: string
            Link:
              description: >-
                When deprecation applies, links to the deprecation notice with
                rel=deprecation; other link relations may also be sent.
              schema:
                type: string
            RateLimit:
              description: >-
                draft-ietf-httpapi-ratelimit-headers-07 section 3.1 structured
                dictionary, for example `limit=100, remaining=41, reset=19`.
                Remaining is the admitted decision's headroom; reset is whole
                seconds until quota next becomes available, not an epoch or a
                promise of a full burst refill. On a limiter's 429 remaining is
                0 and reset equals Retry-After. Accepted key, route and
                per-address policies are compared by lowest remaining, then
                longest reset. A venue refusal without a known quota makes no
                rate-limit header claim.
              schema:
                type: string
            RateLimit-Policy:
              description: >-
                draft-ietf-httpapi-ratelimit-headers-07 section 3.5: quota and
                window in seconds, for example `100;w=60`. Sent on every status
                when a finite limiter counted the request. The applicable policy
                closest to exhaustion is reported (section 3.2): lowest
                remaining, then longest reset. On a limiter's 429 this is
                exactly the policy that refused; if a venue discloses no quota,
                the headers are absent.
              schema:
                type: string
            Sunset:
              description: >-
                Present when retirement is scheduled: the HTTP-date after which
                this version may stop being served (RFC 8594).
              schema:
                type: string
            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: Idempotency conflict
          headers:
            Deprecation:
              description: >-
                Present when this operation is deprecated: an RFC 9745
                structured date, for example @1792443399. Absence makes no
                deprecation claim.
              schema:
                type: string
            Link:
              description: >-
                When deprecation applies, links to the deprecation notice with
                rel=deprecation; other link relations may also be sent.
              schema:
                type: string
            RateLimit:
              description: >-
                draft-ietf-httpapi-ratelimit-headers-07 section 3.1 structured
                dictionary, for example `limit=100, remaining=41, reset=19`.
                Remaining is the admitted decision's headroom; reset is whole
                seconds until quota next becomes available, not an epoch or a
                promise of a full burst refill. On a limiter's 429 remaining is
                0 and reset equals Retry-After. Accepted key, route and
                per-address policies are compared by lowest remaining, then
                longest reset. A venue refusal without a known quota makes no
                rate-limit header claim.
              schema:
                type: string
            RateLimit-Policy:
              description: >-
                draft-ietf-httpapi-ratelimit-headers-07 section 3.5: quota and
                window in seconds, for example `100;w=60`. Sent on every status
                when a finite limiter counted the request. The applicable policy
                closest to exhaustion is reported (section 3.2): lowest
                remaining, then longest reset. On a limiter's 429 this is
                exactly the policy that refused; if a venue discloses no quota,
                the headers are absent.
              schema:
                type: string
            Sunset:
              description: >-
                Present when retirement is scheduled: the HTTP-date after which
                this version may stop being served (RFC 8594).
              schema:
                type: string
            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:
            Deprecation:
              description: >-
                Present when this operation is deprecated: an RFC 9745
                structured date, for example @1792443399. Absence makes no
                deprecation claim.
              schema:
                type: string
            Link:
              description: >-
                When deprecation applies, links to the deprecation notice with
                rel=deprecation; other link relations may also be sent.
              schema:
                type: string
            RateLimit:
              description: >-
                draft-ietf-httpapi-ratelimit-headers-07 section 3.1 structured
                dictionary, for example `limit=100, remaining=41, reset=19`.
                Remaining is the admitted decision's headroom; reset is whole
                seconds until quota next becomes available, not an epoch or a
                promise of a full burst refill. On a limiter's 429 remaining is
                0 and reset equals Retry-After. Accepted key, route and
                per-address policies are compared by lowest remaining, then
                longest reset. A venue refusal without a known quota makes no
                rate-limit header claim.
              schema:
                type: string
            RateLimit-Policy:
              description: >-
                draft-ietf-httpapi-ratelimit-headers-07 section 3.5: quota and
                window in seconds, for example `100;w=60`. Sent on every status
                when a finite limiter counted the request. The applicable policy
                closest to exhaustion is reported (section 3.2): lowest
                remaining, then longest reset. On a limiter's 429 this is
                exactly the policy that refused; if a venue discloses no quota,
                the headers are absent.
              schema:
                type: string
            Sunset:
              description: >-
                Present when retirement is scheduled: the HTTP-date after which
                this version may stop being served (RFC 8594).
              schema:
                type: string
            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:
            Deprecation:
              description: >-
                Present when this operation is deprecated: an RFC 9745
                structured date, for example @1792443399. Absence makes no
                deprecation claim.
              schema:
                type: string
            Link:
              description: >-
                When deprecation applies, links to the deprecation notice with
                rel=deprecation; other link relations may also be sent.
              schema:
                type: string
            RateLimit:
              description: >-
                draft-ietf-httpapi-ratelimit-headers-07 section 3.1 structured
                dictionary, for example `limit=100, remaining=41, reset=19`.
                Remaining is the admitted decision's headroom; reset is whole
                seconds until quota next becomes available, not an epoch or a
                promise of a full burst refill. On a limiter's 429 remaining is
                0 and reset equals Retry-After. Accepted key, route and
                per-address policies are compared by lowest remaining, then
                longest reset. A venue refusal without a known quota makes no
                rate-limit header claim.
              schema:
                type: string
            RateLimit-Policy:
              description: >-
                draft-ietf-httpapi-ratelimit-headers-07 section 3.5: quota and
                window in seconds, for example `100;w=60`. Sent on every status
                when a finite limiter counted the request. The applicable policy
                closest to exhaustion is reported (section 3.2): lowest
                remaining, then longest reset. On a limiter's 429 this is
                exactly the policy that refused; if a venue discloses no quota,
                the headers are absent.
              schema:
                type: string
            Sunset:
              description: >-
                Present when retirement is scheduled: the HTTP-date after which
                this version may stop being served (RFC 8594).
              schema:
                type: string
            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:
            Deprecation:
              description: >-
                Present when this operation is deprecated: an RFC 9745
                structured date, for example @1792443399. Absence makes no
                deprecation claim.
              schema:
                type: string
            Link:
              description: >-
                When deprecation applies, links to the deprecation notice with
                rel=deprecation; other link relations may also be sent.
              schema:
                type: string
            RateLimit:
              description: >-
                draft-ietf-httpapi-ratelimit-headers-07 section 3.1 structured
                dictionary, for example `limit=100, remaining=41, reset=19`.
                Remaining is the admitted decision's headroom; reset is whole
                seconds until quota next becomes available, not an epoch or a
                promise of a full burst refill. On a limiter's 429 remaining is
                0 and reset equals Retry-After. Accepted key, route and
                per-address policies are compared by lowest remaining, then
                longest reset. A venue refusal without a known quota makes no
                rate-limit header claim.
              schema:
                type: string
            RateLimit-Policy:
              description: >-
                draft-ietf-httpapi-ratelimit-headers-07 section 3.5: quota and
                window in seconds, for example `100;w=60`. Sent on every status
                when a finite limiter counted the request. The applicable policy
                closest to exhaustion is reported (section 3.2): lowest
                remaining, then longest reset. On a limiter's 429 this is
                exactly the policy that refused; if a venue discloses no quota,
                the headers are absent.
              schema:
                type: string
            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
            Sunset:
              description: >-
                Present when retirement is scheduled: the HTTP-date after which
                this version may stop being served (RFC 8594).
              schema:
                type: string
            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: Delivery failed
          headers:
            Deprecation:
              description: >-
                Present when this operation is deprecated: an RFC 9745
                structured date, for example @1792443399. Absence makes no
                deprecation claim.
              schema:
                type: string
            Link:
              description: >-
                When deprecation applies, links to the deprecation notice with
                rel=deprecation; other link relations may also be sent.
              schema:
                type: string
            RateLimit:
              description: >-
                draft-ietf-httpapi-ratelimit-headers-07 section 3.1 structured
                dictionary, for example `limit=100, remaining=41, reset=19`.
                Remaining is the admitted decision's headroom; reset is whole
                seconds until quota next becomes available, not an epoch or a
                promise of a full burst refill. On a limiter's 429 remaining is
                0 and reset equals Retry-After. Accepted key, route and
                per-address policies are compared by lowest remaining, then
                longest reset. A venue refusal without a known quota makes no
                rate-limit header claim.
              schema:
                type: string
            RateLimit-Policy:
              description: >-
                draft-ietf-httpapi-ratelimit-headers-07 section 3.5: quota and
                window in seconds, for example `100;w=60`. Sent on every status
                when a finite limiter counted the request. The applicable policy
                closest to exhaustion is reported (section 3.2): lowest
                remaining, then longest reset. On a limiter's 429 this is
                exactly the policy that refused; if a venue discloses no quota,
                the headers are absent.
              schema:
                type: string
            Sunset:
              description: >-
                Present when retirement is scheduled: the HTTP-date after which
                this version may stop being served (RFC 8594).
              schema:
                type: string
            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: Idempotency unavailable
          headers:
            Deprecation:
              description: >-
                Present when this operation is deprecated: an RFC 9745
                structured date, for example @1792443399. Absence makes no
                deprecation claim.
              schema:
                type: string
            Link:
              description: >-
                When deprecation applies, links to the deprecation notice with
                rel=deprecation; other link relations may also be sent.
              schema:
                type: string
            RateLimit:
              description: >-
                draft-ietf-httpapi-ratelimit-headers-07 section 3.1 structured
                dictionary, for example `limit=100, remaining=41, reset=19`.
                Remaining is the admitted decision's headroom; reset is whole
                seconds until quota next becomes available, not an epoch or a
                promise of a full burst refill. On a limiter's 429 remaining is
                0 and reset equals Retry-After. Accepted key, route and
                per-address policies are compared by lowest remaining, then
                longest reset. A venue refusal without a known quota makes no
                rate-limit header claim.
              schema:
                type: string
            RateLimit-Policy:
              description: >-
                draft-ietf-httpapi-ratelimit-headers-07 section 3.5: quota and
                window in seconds, for example `100;w=60`. Sent on every status
                when a finite limiter counted the request. The applicable policy
                closest to exhaustion is reported (section 3.2): lowest
                remaining, then longest reset. On a limiter's 429 this is
                exactly the policy that refused; if a venue discloses no quota,
                the headers are absent.
              schema:
                type: string
            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
            Sunset:
              description: >-
                Present when retirement is scheduled: the HTTP-date after which
                this version may stop being served (RFC 8594).
              schema:
                type: string
            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:
            - webhooks_manage
        - api_key:
            - webhooks_manage
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:
    CreateWebhookDeliveryRequest:
      additionalProperties: false
      description: Create a test delivery under an existing webhook.
      properties:
        kind:
          description: >-
            Only test deliveries may be created by clients. Other kinds are
            refused.
          example: test
          pattern: ^test$
          type: string
      required:
        - kind
      type: object
    WebhookDelivery:
      description: A delivery log entry for a webhook invocation.
      properties:
        attempt:
          format: int32
          minimum: 0
          type: integer
        deliveredAt:
          format: date-time
          type: string
        errorMessage:
          type:
            - string
            - 'null'
        eventType:
          $ref: '#/components/schemas/WebhookEventType'
        id:
          format: uuid
          type: string
        payload:
          description: >-
            Fiat payload example captured live from a persisted bank-deposit
            event (rfq 2ef31a1ea),

            not a delivery receipt. References retain the API's masks exactly.
        redeliverAvailable:
          description: >-
            Actual retained availability, not permission to resend; redelivery
            revalidates.
          type:
            - boolean
            - 'null'
        redeliveryOf:
          format: uuid
          type:
            - string
            - 'null'
        statusCode:
          format: int32
          minimum: 0
          type:
            - integer
            - 'null'
        success:
          type: boolean
        test:
          type: boolean
        webhookId:
          type: string
      required:
        - id
        - webhookId
        - eventType
        - success
        - attempt
        - deliveredAt
      type: object
    ApiError:
      description: >-
        The shared refusal body of every integrator operation, including
        edge-layer errors.

        `error` is an open, stable machine-readable code; `docUrl` links to its
        documentation and

        `retryable` says whether an unchanged request may succeed later.
        `message` is for people,

        not matching. `timestamp` is RFC 3339 UTC; optional `requestId` mirrors
        `X-Request-Id`.

        Optional `next` describes recovery and `details` carries code-specific
        information.

        Handle known codes and fall back on the HTTP status for unknown ones.
      properties:
        details:
          oneOf:
            - type: 'null'
            - $ref: '#/components/schemas/ApiErrorDetails'
          x-undiscriminated-union-reason: >-
            Nullable value: JSON null has no properties and cannot carry a
            discriminator.
        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).
          x-undiscriminated-union-reason: >-
            Nullable value: JSON null has no properties and cannot carry a
            discriminator.
        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, as an RFC 3339 UTC timestamp.
          format: date-time
          type: string
      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.payout.needs_checking
        - 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.workspace.frozen
        - treasury.balance.low
        - treasury.balance.recovered
        - treasury.statement.ready
        - treasury.automation.created
        - treasury.automation.updated
        - treasury.automation.activated
        - 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.payment.authorized
        - treasury.agent.payment.settled
        - treasury.agent.payment.refused
        - treasury.agent.payment.received
        - order.updated
        - settlement.window.ready
        - settlement.obligation.due
        - settlement.obligation.overdue
        - settlement.payment.matched
        - member.added
        - member.removed
        - api_key.rotated
        - api_key.revoked
        - api_key.expiring_soon
        - compliance.sanctions.flag_added
        - compliance.event
        - credit.updated
        - direct_user.created
        - direct_user.verification.pending
        - direct_user.verification.verified
        - direct_user.verification.rejected
        - wallet.session_signer.granted
        - wallet.session_signer.revoked
        - 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'
        consentedWindow:
          oneOf:
            - type: 'null'
            - $ref: '#/components/schemas/SettlementWindowTerms'
              description: >-
                `SETTLEMENT_WINDOW_CHANGED`: the settlement window the order
                consented to (the quoted

                window, or the one its `settlementWindowId` named), which is no
                longer the one assigned.
          x-undiscriminated-union-reason: >-
            Nullable value: JSON null has no properties and cannot carry a
            discriminator.
        currentWindow:
          oneOf:
            - type: 'null'
            - $ref: '#/components/schemas/SettlementWindowTerms'
              description: >-
                `SETTLEMENT_WINDOW_CHANGED`: the settlement window the server
                assigns the trade now.

                Send the same quote again with `settlementWindowId` set to
                `details.currentWindow.windowId`

                to consent to it.
          x-undiscriminated-union-reason: >-
            Nullable value: JSON null has no properties and cannot carry a
            discriminator.
        field:
          description: >-
            `INVALID_REQUEST`: the path of a missing required, unknown, mistyped
            or out-of-range

            field (for example `buy` or `sell.asset`), never the parser's
            message or input value.
          type:
            - string
            - 'null'
        reason:
          anyOf:
            - $ref: '#/components/schemas/SourceReason'
            - type: 'null'
          description: >-
            A machine-readable reason token the refusing step gave.


            Known source reason tokens (not all apply to every status):
            `clockUnavailable`, `assetUnsupported`, `referenceUndeclarable`,
            `referenceNotAdmitted`, `referenceStale`, `referenceDepth`,
            `marketDataUnavailable`, `calibrationUnavailable`,
            `livePriceUnavailable`, `lpQuoteUnavailable`,
            `platformJurisdictionCountryRequired`,
            `platformJurisdictionUnavailable`, `platformJurisdictionBlocked`,
            `venueJurisdictionExcluded`, `workspaceJurisdictionRequired`,
            `jurisdictionRegionRequired`, `jurisdictionUnavailable`,
            `venueKeyRefusedLikelyIpAllowlist`,
            `venueWithdrawalDestinationNotWhitelisted`,
            `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`, `signerLacksRight`,
            `signerUnavailable`, `signingGrantAmbiguous`, `signingGrantExpired`,
            `nativeGrantExpiryReapprovalRequired`, `nativeBalanceUnavailable`,
            `solanaFinalityUnavailable`, `tronSolidBlockUnavailable`,
            `signingGrantPolicyUnreadable`, `signingGrantPolicyChecking`,
            `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`, `cctpWalletRequired`, `acrossWalletRequired`,
            `walletBrowserSigningEvmOnly`, `relayChainNotCarried`,
            `apiKeyAdvancedWalletUnsupported`,
            `apiKeyOrganisationWalletScopeRequired`, `grantCapExceeded`,
            `amountAboveMaximum`, `amountBelowMinimum`, `belowVenueMinimum`,
            `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`, `firmAskFundsTimedOut`,
            `firmAskPreparationTimedOut`, `quotePreparationFailed`,
            `firmAskAdmissionTimedOut`, `seliniFirmAskMarketsTimedOut`,
            `seliniFirmAskHandoffTimedOut`, `seliniFirmAskBeforePostTimedOut`,
            `seliniFirmAskValidationTimedOut`, `seliniFirmAskResponseTimedOut`,
            `seliniFirmAskTransportFailure`, `rfqQuoteRefusedQuoteNotAvailable`,
            `rfqQuoteRefusedQuotingDisabled`,
            `rfqQuoteRefusedClientRfqNotConfigured`,
            `rfqQuoteRefusedClientProfileNotLoaded`,
            `rfqQuoteRefusedMarketDisabled`, `rfqQuoteRefusedInvalidQuantity`,
            `rfqQuoteRefusedInvalidSide`, `rfqQuoteRefusedInvalidCurrency`,
            `rfqQuoteRefusedPricePrecisionError`, `rfqQuoteRefusedRfqError`,
            `rfqQuoteRefused`, `venueOutcomeIndeterminate`,
            `venueBodyUnreadable`, `venueResponseUnmapped`, `venueRateLimited`,
            `venueQuoteAdmissionExpired`, `placementSignedPastDeadline`,
            `quoteIdentityConflict`, `symbolUnsupported`,
            `marketSymbolAmbiguous`, `firmAskPrincipalRequired`,
            `indicativeRequested`, `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`, `accountFundingReadUnverified`,
            `quoteReconfirmationRequired`, `quoteRejected`,
            `keyrockSecurityCatalogueUnavailable`,
            `venueAnsweredAfterQuoteWindow`, `venueQuoteIntentMismatch`,
            `payExactUnsupported`, `receiveWalletNotServed`,
            `referenceMidUnreadable`, `referencePriceUnavailable`,
            `registryUnavailable`, `releaseRecheckUnavailable`,
            `requestUnbuildable`, `routeLegChainUnknown`, `routeLegUnnamed`,
            `routeLegUnplanned`, `routeUnavailable`, `secondFactorUnreadable`,
            `shortfallUnmeasured`, `shortfallUnreadable`, `singleChainVenue`,
            `siteChainUnreadable`, `sizeNotEligible`, `submitOrderBlocked`,
            `takerOnboardingIncomplete`, `tierNotQuoted`, `tradePaused`,
            `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`,
            `bebopQuorumWalletTooSlow`, `bebopWalletQuorumUnreadable`,
            `bebopBrowserWalletUnsupported`, `connectionNotConfigured`,
            `deliveryAccountNetworkUnavailable`, `deliveryAccountUnavailable`,
            `destinationCannotSendOnChain`, `dexReferencePriceUnavailable`,
            `firmQuoteLimited`, `fundingAccountNetworkUnavailable`,
            `fundingAccountUnavailable`, `insufficientDepth`,
            `missingPermission`, `needsNativeGas`, `needsWallet`, `notPriced`,
            `payInTermsUnavailable`, `pilotTradeCapExceeded`,
            `pilotMinimumAboveTradeCap`, `platformFeeRateUnavailable`,
            `pricingBookPairUnserved`, `settlementDeclarationUnavailable`,
            `settlementNotAvailable`, `timedOut`, `timedOutBeforeSend`,
            `tradingSourceNetworkUnavailable`, `tradingSourceNotLinked`,
            `venueEnablementRechecking`, `venueEnablementUnavailable`,
            `venueListingTimedOut`, `venuePoliciesUnavailable`,
            `multiliquidPaused`, `multiliquidAssetNotAccepted`,
            `walletNotAllowlistedForAsset`, `walletBlacklisted`,
            `multiliquidPriceInvalid`, `multiliquidStablePriceOutOfBand`,
            `multiliquidInsufficientLiquidity`,
            `multiliquidProviderPrefundUnavailable`,
            `multiliquidDailyLimitReached`, `eligibilityUnverifiable`,
            `multiliquidInsufficientBalance`,
            `multiliquidWalletFundsInsufficient`,
            `multiliquidInsufficientAllowance`, `walletTokenAccountFrozen`,
            `multiliquidAmountInTooHigh`, `multiliquidAmountOutTooLow`,
            `multiliquidInsufficientLpFeeBalance`,
            `multiliquidTransferFeeNotSupported`,
            `multiliquidParticipantUnavailable`, `multiliquidChainNotSupported`,
            `multiliquidObservationWalletUnavailable`,
            `privyMultiliquidArrayPinsUnsupported`, `cctpDestinationNotGranted`,
            `signingGrantNativeOnly`, `quoteRejectedInsufficientBalance`,
            `walletGateUnreadable`, `policyBlocked`,
            `treasuryPolicyApprovalRequired`, `destinationTagRequired`,
            `destinationTagMismatch`, `destinationTagInvalid`,
            `acrossBasicLaneNotEnabled`, `creditReadUnavailable`,
            `exactOutputFirmAskUnsupported`, `grantEndsBeforeVenueFunding`,
            `jurisdictionNotServed`, `pairUnsupported`,
            `requesterJurisdictionUnknown`, `venueAccountHasNoKey`,
            `venueAssessmentRequired`, `venueConnectionInvalid`,
            `venueReenableRequiresNewCredentials`, `venueTradingPaused`,
            `balanceNotObserved`, `notPermitted`, `balanceNotPermitted`,
            `gasUnchecked`, `catalogueWaitStateUnavailable`,
            `cctpRouteUpgrading`, `creditOnly`, `dexReferencePriceMissing`,
            `quoteAuthorityUnavailable`, `venueRoutingOff`,
            `venueRoutingStateUnavailable`, `indicativeUnavailable`,
            `marketUnavailable`, `noReferenceMid`,
            `observationBindingUnavailable`, `quoteIdUnavailable`, `stalePrice`.


            New values may be added; treat unknown values as other.
          x-undiscriminated-union-reason: >-
            Nullable value: JSON null has no properties and cannot carry a
            discriminator.
        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.
          x-undiscriminated-union-reason: >-
            Nullable value: JSON null has no properties and cannot carry a
            discriminator.
        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:
        mapping:
          contact: '#/components/schemas/QuoteNextAction/oneOf/8'
          fund: '#/components/schemas/QuoteNextAction/oneOf/4'
          order: '#/components/schemas/QuoteNextAction/oneOf/0'
          preflight: '#/components/schemas/QuoteNextAction/oneOf/1'
          requote: '#/components/schemas/QuoteNextAction/oneOf/5'
          search: '#/components/schemas/QuoteNextAction/oneOf/6'
          sign: '#/components/schemas/QuoteNextAction/oneOf/3'
          transact: '#/components/schemas/QuoteNextAction/oneOf/2'
          wait: '#/components/schemas/QuoteNextAction/oneOf/7'
        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: >-
            This quote requires Advanced wallet preparation, which is not
            available to integrators at launch. Do not submit this quote; select
            an orderable Basic quote.
          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'
              x-undiscriminated-union-reason: >-
                Nullable value: JSON null has no properties and cannot carry a
                discriminator.
            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 funding or delivery selections
            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
    SettlementWindowTerms:
      description: >-
        The account schedule's window a delayed trade settles in, fixed when the
        quote was

        made and recorded unchanged on the executed trade. A `clock` window
        carries `settlesBy`,

        the occurrence's confirmed completion; an `onAgreement` window (an
        LP-issued statement with

        no completion term) carries none. A window whose completion is pending
        on any other

        schedule is never emitted.
      properties:
        assumedBoundary:
          oneOf:
            - type: 'null'
            - $ref: '#/components/schemas/AssumedWindowBoundary'
              description: >-
                Present when the window's boundary comes from an assumed
                schedule term rather than the

                LP's confirmation: every surface shows the window as assumed
                until the LP confirms it.
          x-undiscriminated-union-reason: >-
            Nullable value: JSON null has no properties and cannot carry a
            discriminator.
        cadence:
          $ref: '#/components/schemas/SettlementCadence'
        cutoffAt:
          format: date-time
          type:
            - string
            - 'null'
        paymentDeadlineAt:
          description: >-
            The occurrence's payment deadline from its schedule terms: what a
            credit trade's debt is

            paid by. Absent while the schedule has not confirmed it; never
            derived from `settlesBy`.
          format: date-time
          type:
            - string
            - 'null'
        scheduleId:
          type: string
        scheduleLabel:
          description: >-
            The published schedule version's display name (e.g. "EU"), so a
            quote card or Review

            names the window without a settlement read permission.
          type: string
        scheduleVersion:
          format: int64
          type: integer
        settlementBasis:
          $ref: '#/components/schemas/WindowSettlementBasis'
        settlesBy:
          format: date-time
          type:
            - string
            - 'null'
        snapshotAt:
          format: date-time
          type: string
        statementIssuer:
          description: >-
            The LP whose statement settles an `onAgreement` window ("Keyrock");
            absent on a clock window.
          type:
            - string
            - 'null'
        windowId:
          format: uuid
          type: string
      required:
        - windowId
        - scheduleId
        - scheduleVersion
        - scheduleLabel
        - cadence
        - snapshotAt
      type: object
    SourceReason:
      description: >-
        Known source reason tokens (not all apply to every status):
        `clockUnavailable`, `assetUnsupported`, `referenceUndeclarable`,
        `referenceNotAdmitted`, `referenceStale`, `referenceDepth`,
        `marketDataUnavailable`, `calibrationUnavailable`,
        `livePriceUnavailable`, `lpQuoteUnavailable`,
        `platformJurisdictionCountryRequired`,
        `platformJurisdictionUnavailable`, `platformJurisdictionBlocked`,
        `venueJurisdictionExcluded`, `workspaceJurisdictionRequired`,
        `jurisdictionRegionRequired`, `jurisdictionUnavailable`,
        `venueKeyRefusedLikelyIpAllowlist`,
        `venueWithdrawalDestinationNotWhitelisted`,
        `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`, `signerLacksRight`, `signerUnavailable`,
        `signingGrantAmbiguous`, `signingGrantExpired`,
        `nativeGrantExpiryReapprovalRequired`, `nativeBalanceUnavailable`,
        `solanaFinalityUnavailable`, `tronSolidBlockUnavailable`,
        `signingGrantPolicyUnreadable`, `signingGrantPolicyChecking`,
        `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`,
        `cctpWalletRequired`, `acrossWalletRequired`,
        `walletBrowserSigningEvmOnly`, `relayChainNotCarried`,
        `apiKeyAdvancedWalletUnsupported`,
        `apiKeyOrganisationWalletScopeRequired`, `grantCapExceeded`,
        `amountAboveMaximum`, `amountBelowMinimum`, `belowVenueMinimum`,
        `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`, `firmAskFundsTimedOut`, `firmAskPreparationTimedOut`,
        `quotePreparationFailed`, `firmAskAdmissionTimedOut`,
        `seliniFirmAskMarketsTimedOut`, `seliniFirmAskHandoffTimedOut`,
        `seliniFirmAskBeforePostTimedOut`, `seliniFirmAskValidationTimedOut`,
        `seliniFirmAskResponseTimedOut`, `seliniFirmAskTransportFailure`,
        `rfqQuoteRefusedQuoteNotAvailable`, `rfqQuoteRefusedQuotingDisabled`,
        `rfqQuoteRefusedClientRfqNotConfigured`,
        `rfqQuoteRefusedClientProfileNotLoaded`,
        `rfqQuoteRefusedMarketDisabled`, `rfqQuoteRefusedInvalidQuantity`,
        `rfqQuoteRefusedInvalidSide`, `rfqQuoteRefusedInvalidCurrency`,
        `rfqQuoteRefusedPricePrecisionError`, `rfqQuoteRefusedRfqError`,
        `rfqQuoteRefused`, `venueOutcomeIndeterminate`, `venueBodyUnreadable`,
        `venueResponseUnmapped`, `venueRateLimited`,
        `venueQuoteAdmissionExpired`, `placementSignedPastDeadline`,
        `quoteIdentityConflict`, `symbolUnsupported`, `marketSymbolAmbiguous`,
        `firmAskPrincipalRequired`, `indicativeRequested`, `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`,
        `accountFundingReadUnverified`, `quoteReconfirmationRequired`,
        `quoteRejected`, `keyrockSecurityCatalogueUnavailable`,
        `venueAnsweredAfterQuoteWindow`, `venueQuoteIntentMismatch`,
        `payExactUnsupported`, `receiveWalletNotServed`,
        `referenceMidUnreadable`, `referencePriceUnavailable`,
        `registryUnavailable`, `releaseRecheckUnavailable`,
        `requestUnbuildable`, `routeLegChainUnknown`, `routeLegUnnamed`,
        `routeLegUnplanned`, `routeUnavailable`, `secondFactorUnreadable`,
        `shortfallUnmeasured`, `shortfallUnreadable`, `singleChainVenue`,
        `siteChainUnreadable`, `sizeNotEligible`, `submitOrderBlocked`,
        `takerOnboardingIncomplete`, `tierNotQuoted`, `tradePaused`,
        `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`,
        `bebopQuorumWalletTooSlow`, `bebopWalletQuorumUnreadable`,
        `bebopBrowserWalletUnsupported`, `connectionNotConfigured`,
        `deliveryAccountNetworkUnavailable`, `deliveryAccountUnavailable`,
        `destinationCannotSendOnChain`, `dexReferencePriceUnavailable`,
        `firmQuoteLimited`, `fundingAccountNetworkUnavailable`,
        `fundingAccountUnavailable`, `insufficientDepth`, `missingPermission`,
        `needsNativeGas`, `needsWallet`, `notPriced`, `payInTermsUnavailable`,
        `pilotTradeCapExceeded`, `pilotMinimumAboveTradeCap`,
        `platformFeeRateUnavailable`, `pricingBookPairUnserved`,
        `settlementDeclarationUnavailable`, `settlementNotAvailable`,
        `timedOut`, `timedOutBeforeSend`, `tradingSourceNetworkUnavailable`,
        `tradingSourceNotLinked`, `venueEnablementRechecking`,
        `venueEnablementUnavailable`, `venueListingTimedOut`,
        `venuePoliciesUnavailable`, `multiliquidPaused`,
        `multiliquidAssetNotAccepted`, `walletNotAllowlistedForAsset`,
        `walletBlacklisted`, `multiliquidPriceInvalid`,
        `multiliquidStablePriceOutOfBand`, `multiliquidInsufficientLiquidity`,
        `multiliquidProviderPrefundUnavailable`, `multiliquidDailyLimitReached`,
        `eligibilityUnverifiable`, `multiliquidInsufficientBalance`,
        `multiliquidWalletFundsInsufficient`,
        `multiliquidInsufficientAllowance`, `walletTokenAccountFrozen`,
        `multiliquidAmountInTooHigh`, `multiliquidAmountOutTooLow`,
        `multiliquidInsufficientLpFeeBalance`,
        `multiliquidTransferFeeNotSupported`,
        `multiliquidParticipantUnavailable`, `multiliquidChainNotSupported`,
        `multiliquidObservationWalletUnavailable`,
        `privyMultiliquidArrayPinsUnsupported`, `cctpDestinationNotGranted`,
        `signingGrantNativeOnly`, `quoteRejectedInsufficientBalance`,
        `walletGateUnreadable`, `policyBlocked`,
        `treasuryPolicyApprovalRequired`, `destinationTagRequired`,
        `destinationTagMismatch`, `destinationTagInvalid`,
        `acrossBasicLaneNotEnabled`, `creditReadUnavailable`,
        `exactOutputFirmAskUnsupported`, `grantEndsBeforeVenueFunding`,
        `jurisdictionNotServed`, `pairUnsupported`,
        `requesterJurisdictionUnknown`, `venueAccountHasNoKey`,
        `venueAssessmentRequired`, `venueConnectionInvalid`,
        `venueReenableRequiresNewCredentials`, `venueTradingPaused`,
        `balanceNotObserved`, `notPermitted`, `balanceNotPermitted`,
        `gasUnchecked`, `catalogueWaitStateUnavailable`, `cctpRouteUpgrading`,
        `creditOnly`, `dexReferencePriceMissing`, `quoteAuthorityUnavailable`,
        `venueRoutingOff`, `venueRoutingStateUnavailable`,
        `indicativeUnavailable`, `marketUnavailable`, `noReferenceMid`,
        `observationBindingUnavailable`, `quoteIdUnavailable`, `stalePrice`.


        New values may be added; treat unknown values as other.
      enum:
        - clockUnavailable
        - assetUnsupported
        - referenceUndeclarable
        - referenceNotAdmitted
        - referenceStale
        - referenceDepth
        - marketDataUnavailable
        - calibrationUnavailable
        - livePriceUnavailable
        - lpQuoteUnavailable
        - platformJurisdictionCountryRequired
        - platformJurisdictionUnavailable
        - platformJurisdictionBlocked
        - venueJurisdictionExcluded
        - workspaceJurisdictionRequired
        - jurisdictionRegionRequired
        - jurisdictionUnavailable
        - venueKeyRefusedLikelyIpAllowlist
        - venueWithdrawalDestinationNotWhitelisted
        - 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
        - signerLacksRight
        - signerUnavailable
        - signingGrantAmbiguous
        - signingGrantExpired
        - nativeGrantExpiryReapprovalRequired
        - nativeBalanceUnavailable
        - solanaFinalityUnavailable
        - tronSolidBlockUnavailable
        - signingGrantPolicyUnreadable
        - signingGrantPolicyChecking
        - 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
        - cctpWalletRequired
        - acrossWalletRequired
        - walletBrowserSigningEvmOnly
        - relayChainNotCarried
        - apiKeyAdvancedWalletUnsupported
        - apiKeyOrganisationWalletScopeRequired
        - grantCapExceeded
        - amountAboveMaximum
        - amountBelowMinimum
        - belowVenueMinimum
        - 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
        - firmAskFundsTimedOut
        - firmAskPreparationTimedOut
        - quotePreparationFailed
        - firmAskAdmissionTimedOut
        - seliniFirmAskMarketsTimedOut
        - seliniFirmAskHandoffTimedOut
        - seliniFirmAskBeforePostTimedOut
        - seliniFirmAskValidationTimedOut
        - seliniFirmAskResponseTimedOut
        - seliniFirmAskTransportFailure
        - rfqQuoteRefusedQuoteNotAvailable
        - rfqQuoteRefusedQuotingDisabled
        - rfqQuoteRefusedClientRfqNotConfigured
        - rfqQuoteRefusedClientProfileNotLoaded
        - rfqQuoteRefusedMarketDisabled
        - rfqQuoteRefusedInvalidQuantity
        - rfqQuoteRefusedInvalidSide
        - rfqQuoteRefusedInvalidCurrency
        - rfqQuoteRefusedPricePrecisionError
        - rfqQuoteRefusedRfqError
        - rfqQuoteRefused
        - venueOutcomeIndeterminate
        - venueBodyUnreadable
        - venueResponseUnmapped
        - venueRateLimited
        - venueQuoteAdmissionExpired
        - placementSignedPastDeadline
        - quoteIdentityConflict
        - symbolUnsupported
        - marketSymbolAmbiguous
        - firmAskPrincipalRequired
        - indicativeRequested
        - 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
        - accountFundingReadUnverified
        - quoteReconfirmationRequired
        - quoteRejected
        - keyrockSecurityCatalogueUnavailable
        - venueAnsweredAfterQuoteWindow
        - venueQuoteIntentMismatch
        - payExactUnsupported
        - receiveWalletNotServed
        - referenceMidUnreadable
        - referencePriceUnavailable
        - registryUnavailable
        - releaseRecheckUnavailable
        - requestUnbuildable
        - routeLegChainUnknown
        - routeLegUnnamed
        - routeLegUnplanned
        - routeUnavailable
        - secondFactorUnreadable
        - shortfallUnmeasured
        - shortfallUnreadable
        - singleChainVenue
        - siteChainUnreadable
        - sizeNotEligible
        - submitOrderBlocked
        - takerOnboardingIncomplete
        - tierNotQuoted
        - tradePaused
        - 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
        - bebopQuorumWalletTooSlow
        - bebopWalletQuorumUnreadable
        - bebopBrowserWalletUnsupported
        - connectionNotConfigured
        - deliveryAccountNetworkUnavailable
        - deliveryAccountUnavailable
        - destinationCannotSendOnChain
        - dexReferencePriceUnavailable
        - firmQuoteLimited
        - fundingAccountNetworkUnavailable
        - fundingAccountUnavailable
        - insufficientDepth
        - missingPermission
        - needsNativeGas
        - needsWallet
        - notPriced
        - payInTermsUnavailable
        - pilotTradeCapExceeded
        - pilotMinimumAboveTradeCap
        - platformFeeRateUnavailable
        - pricingBookPairUnserved
        - settlementDeclarationUnavailable
        - settlementNotAvailable
        - timedOut
        - timedOutBeforeSend
        - tradingSourceNetworkUnavailable
        - tradingSourceNotLinked
        - venueEnablementRechecking
        - venueEnablementUnavailable
        - venueListingTimedOut
        - venuePoliciesUnavailable
        - multiliquidPaused
        - multiliquidAssetNotAccepted
        - walletNotAllowlistedForAsset
        - walletBlacklisted
        - multiliquidPriceInvalid
        - multiliquidStablePriceOutOfBand
        - multiliquidInsufficientLiquidity
        - multiliquidProviderPrefundUnavailable
        - multiliquidDailyLimitReached
        - eligibilityUnverifiable
        - multiliquidInsufficientBalance
        - multiliquidWalletFundsInsufficient
        - multiliquidInsufficientAllowance
        - walletTokenAccountFrozen
        - multiliquidAmountInTooHigh
        - multiliquidAmountOutTooLow
        - multiliquidInsufficientLpFeeBalance
        - multiliquidTransferFeeNotSupported
        - multiliquidParticipantUnavailable
        - multiliquidChainNotSupported
        - multiliquidObservationWalletUnavailable
        - privyMultiliquidArrayPinsUnsupported
        - cctpDestinationNotGranted
        - signingGrantNativeOnly
        - quoteRejectedInsufficientBalance
        - walletGateUnreadable
        - policyBlocked
        - treasuryPolicyApprovalRequired
        - destinationTagRequired
        - destinationTagMismatch
        - destinationTagInvalid
        - acrossBasicLaneNotEnabled
        - creditReadUnavailable
        - exactOutputFirmAskUnsupported
        - grantEndsBeforeVenueFunding
        - jurisdictionNotServed
        - pairUnsupported
        - requesterJurisdictionUnknown
        - venueAccountHasNoKey
        - venueAssessmentRequired
        - venueConnectionInvalid
        - venueReenableRequiresNewCredentials
        - venueTradingPaused
        - balanceNotObserved
        - notPermitted
        - balanceNotPermitted
        - gasUnchecked
        - catalogueWaitStateUnavailable
        - cctpRouteUpgrading
        - creditOnly
        - dexReferencePriceMissing
        - quoteAuthorityUnavailable
        - venueRoutingOff
        - venueRoutingStateUnavailable
        - indicativeUnavailable
        - marketUnavailable
        - noReferenceMid
        - observationBindingUnavailable
        - quoteIdUnavailable
        - stalePrice
      type: string
      x-extensible-enum: true
    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:
        mapping:
          bankDeposit: '#/components/schemas/FundInstructions/oneOf/1'
          depositFirstNotOffered: '#/components/schemas/FundInstructions/oneOf/4'
          nativeGas: '#/components/schemas/FundInstructions/oneOf/3'
          venueDeposit: '#/components/schemas/FundInstructions/oneOf/0'
          walletTopUp: '#/components/schemas/FundInstructions/oneOf/2'
        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.
              x-undiscriminated-union-reason: >-
                Nullable value: JSON null has no properties and cannot carry a
                discriminator.
            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 funding or delivery selection 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
        - formsThenReview
        - adminAction
        - otherParty
        - unknown
        - notUnlockable
      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:
        - finishOnboarding
        - companyDetails
        - kybProfile
        - kycDialog
        - linkWallet
        - askAdmin
        - contactBroker
        - manageDirectUsers
        - manageApiKey
        - connectCustodian
        - switchAccountScope
        - contactSupport
        - awaitScreening
        - none
      type: string
      x-extensible-enum: true
    AssumedWindowBoundary:
      description: >-
        The assumption a window's boundary rests on: the zone whose calendar day
        (or local time)

        the boundary assumes, the decision that set it, and the LP whose answer
        replaces it.
      properties:
        lpName:
          type: string
        source:
          description: >-
            Where the assumed boundary came from, as recorded in the settlement
            schedule; free text.
          type: string
        timeZone:
          type: string
      required:
        - timeZone
        - source
        - lpName
      type: object
    SettlementCadence:
      description: >-
        How often a settlement schedule's windows occur (the schedule owns the
        terms).


        New values may be added; treat unknown values as other.
      discriminator:
        mapping:
          daily: '#/components/schemas/SettlementCadence/oneOf/1'
          intraday: '#/components/schemas/SettlementCadence/oneOf/0'
          multiDay: '#/components/schemas/SettlementCadence/oneOf/2'
        propertyName: kind
      oneOf:
        - properties:
            dayBasis:
              $ref: '#/components/schemas/DayBasis'
            everyHours:
              format: int32
              minimum: 0
              type:
                - integer
                - 'null'
            kind:
              description: New values may be added; treat unknown values as other.
              enum:
                - intraday
              type: string
              x-extensible-enum: true
            localTimes:
              items:
                type: string
              type:
                - array
                - 'null'
          required:
            - dayBasis
            - kind
          type: object
        - properties:
            dayBasis:
              $ref: '#/components/schemas/DayBasis'
            days:
              format: int32
              minimum: 0
              type: integer
            kind:
              description: New values may be added; treat unknown values as other.
              enum:
                - daily
              type: string
              x-extensible-enum: true
          required:
            - days
            - dayBasis
            - kind
          type: object
        - properties:
            dayBasis:
              $ref: '#/components/schemas/DayBasis'
            days:
              format: int32
              minimum: 0
              type: integer
            kind:
              description: New values may be added; treat unknown values as other.
              enum:
                - multiDay
              type: string
              x-extensible-enum: true
          required:
            - days
            - dayBasis
            - kind
          type: object
      x-extensible-enum: true
    WindowSettlementBasis:
      description: >-
        What completes a window's settlement. `clock`: the occurrence's
        confirmed completion time

        (`settlesBy`). `onAgreement`: the LP issues the window's statement and
        the trade settles

        once that statement is agreed (Keyrock), so the window states no clock
        time.


        New values may be added; treat unknown values as other.
      enum:
        - clock
        - onAgreement
      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
    DayBasis:
      description: |-
        A settlement schedule's day basis.

        New values may be added; treat unknown values as other.
      enum:
        - calendarDays
        - businessDays
      type: string
      x-extensible-enum: true
  securitySchemes:
    api_key:
      description: >-
        Send the API key in `X-API-Key`.


        **Request signing.** A key with signing enabled (enabled for the key in
        its workspace's credential settings, which return the signing secret
        once; see [Sign
        requests](https://docs.tetrafi.io/authentication#sign-requests)) must
        also sign every request:


        - `X-Timestamp`: the current Unix time in seconds, within 300 seconds of
        the server clock (at most 10 seconds ahead of it on a request that sends
        `X-Nonce`).

        - `X-Nonce`: a fresh random value for each request, 16 to 128 characters
        of `A-Z`, `a-z`, `0-9`, `-` and `_` (a UUID fits). Required on a write
        (POST, PUT, PATCH, DELETE); optional on a read (GET, HEAD).

        - `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 joined by `\n`, with no trailing newline: the
        `X-Timestamp` value, the `X-Nonce` 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 request without `X-Nonce` (a read) omits the
        nonce line and signs four lines.


        A nonce is accepted once per key: the same nonce again inside the window
        is refused, whatever the body, so two identical writes in one second
        each carry their own nonce and both succeed, and a retry signs again
        with a new nonce. Every API server shares one nonce record, so a nonce
        accepted by one server is refused by all of them. Rate admission runs
        first: a rate-limited write (429) does not consume its nonce, and a
        replay sent while the key is rate limited is answered 429; otherwise a
        replay spends a rate token and is refused. A read without a nonce
        changes nothing, so an identical signed read inside the window is
        admitted again. A write whose window has already passed on the nonce
        record's clock when its nonce is recorded is refused as
        `TIMESTAMP_OUT_OF_RANGE`. If the nonce record cannot be read or written
        the request is refused with 503 `API_KEY_UNAVAILABLE`; the nonce may
        have been consumed, so sign again with a new `X-Timestamp` and `X-Nonce`
        before retrying.


        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`, `NONCE_REQUIRED` (a write without `X-Nonce`),
        `NONCE_INVALID` (a malformed or repeated `X-Nonce` header),
        `SIGNATURE_REPLAYED` (the nonce was already accepted).
        `SIGNATURE_PREDATES_RESTART` and 429 `REPLAY_WINDOW_FULL` are reserved
        and not answered today.
      in: header
      name: X-API-Key
      type: apiKey
      x-request-signing:
        algorithm: HMAC-SHA256
        canonicalRequest:
          - timestamp
          - nonce
          - method
          - pathWithQuery
          - bodySha256Hex
        canonicalRequestWithoutNonce:
          - timestamp
          - method
          - pathWithQuery
          - bodySha256Hex
        canonicalSeparator: |+

        nonceFutureSkewSeconds: 10
        nonceHeader: X-Nonce
        noncePattern: ^[A-Za-z0-9_-]{16,128}$
        nonceRequiredMethods:
          - POST
          - PUT
          - PATCH
          - DELETE
        refusal:
          error: AUTH_REQUIRED
          reasons:
            - SIGNATURE_REQUIRED
            - SIGNATURE_INVALID
            - TIMESTAMP_OUT_OF_RANGE
            - NONCE_REQUIRED
            - NONCE_INVALID
            - SIGNATURE_REPLAYED
          status: 401
        reserved:
          - error: AUTH_REQUIRED
            reason: SIGNATURE_PREDATES_RESTART
            status: 401
          - error: REPLAY_WINDOW_FULL
            status: 429
        secretEncoding: hex
        signatureEncoding: hex-lower
        signatureHeader: X-Signature
        timestampHeader: X-Timestamp
        timestampWindowSeconds: 300
      x-tetrafi-scopes:
        compliance_read:
          description: View compliance policies, denials, evidence, and reports
          permission: Read compliance
          permissionIds:
            - ReadCompliance
        fee_schedule_read:
          description: >-
            Read the current and upcoming fee rates for this workspace. Does not
            change rates.
          permission: Read fee schedule
          permissionIds:
            - ReadFeeSchedule
        orders_read:
          description: View order status and history
          permission: Read orders
          permissionIds:
            - ReadOrders
        orders_write:
          description: Submit orders for execution
          permission: Submit orders
          permissionIds:
            - SubmitOrders
        prices_read:
          description: >-
            Read-only access to prices and recorded quotes. Also select Submit
            orders to request new quotes.
          permission: Read quotes
          permissionIds:
            - ReadQuotes
        quotes_read:
          description: >-
            Read-only access to prices and recorded quotes. Also select Submit
            orders to request new quotes.
          permission: Read quotes
          permissionIds:
            - ReadQuotes
        quotes_request:
          description: >-
            Read-only access to prices and recorded quotes. Also select Submit
            orders to request new quotes. Submit orders for execution
          permission: Read quotes + Submit orders
          permissionIds:
            - ReadQuotes
            - SubmitOrders
        settlements_read:
          description: See settlement status and detail.
          permission: Read settlements
          permissionIds:
            - ReadSettlements
        trades_read:
          description: View trade history and audit trails
          permission: Read trades
          permissionIds:
            - ReadTrades
        treasury_read:
          description: >-
            See permitted accounts, balances, payouts and Runs, and refresh
            balances. Does not move money.
          permission: Treasury read
          permissionIds:
            - ReadWallets
        webhooks_manage:
          description: >-
            Configure endpoints and events, test deliveries, read outcomes and
            redeliver. Requires your current Manage webhooks permission.
          permission: Manage webhooks
          permissionIds:
            - ManageWebhooks
    bearer_auth:
      bearerFormat: JWT
      scheme: bearer
      type: http

````

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