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

# Batch reads

> Each item is a GET of an operation in this reference that answers JSON, written as its path and query. Every item runs exactly as a separate GET by the same caller: the same permissions, scopes, workspace checks, response body and error body. The batch authenticates once and counts as one request per item against the caller's rate limit, all taken before any item runs (429 `RATE_LIMITED` refuses the whole batch). Items are independent and not atomic: once admitted the batch answers 200, and each item carries its own `status`, `etag` and `body`, in request order. Item bodies are limited to 8 MiB in all (an item past it answers 413 `BATCH_RESPONSE_TOO_LARGE`), and a batch with its related reads makes at most 200 reads (past it an item answers 429 `SUB_REQUEST_BUDGET_EXHAUSTED`). The answer is `Cache-Control: private, no-store`. A malformed batch, more than 20 items, a non-GET item, a url that is not a GET operation of this reference, or a stream, export or file read is refused as a whole before any item runs, with `details.itemId` naming the item. A signed API-key request cannot be batched: send its reads separately. An API key or OAuth client batches only operations of this reference; each item must be dispatched to the operation it names, else it answers `BATCH_UNKNOWN_ROUTE`. An item keeps its `Deprecation`, `Sunset`, `Link`, `Retry-After` and `Cache-Control` headers in `headers`.



## OpenAPI

````yaml api-reference/openapi.json POST /api/v1/batch
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/batch:
    post:
      tags:
        - batch
      summary: Read up to 20 resources in one request
      description: >-
        Each item is a GET of an operation in this reference that answers JSON,
        written as its path and query. Every item runs exactly as a separate GET
        by the same caller: the same permissions, scopes, workspace checks,
        response body and error body. The batch authenticates once and counts as
        one request per item against the caller's rate limit, all taken before
        any item runs (429 `RATE_LIMITED` refuses the whole batch). Items are
        independent and not atomic: once admitted the batch answers 200, and
        each item carries its own `status`, `etag` and `body`, in request order.
        Item bodies are limited to 8 MiB in all (an item past it answers 413
        `BATCH_RESPONSE_TOO_LARGE`), and a batch with its related reads makes at
        most 200 reads (past it an item answers 429
        `SUB_REQUEST_BUDGET_EXHAUSTED`). The answer is `Cache-Control: private,
        no-store`. A malformed batch, more than 20 items, a non-GET item, a url
        that is not a GET operation of this reference, or a stream, export or
        file read is refused as a whole before any item runs, with
        `details.itemId` naming the item. A signed API-key request cannot be
        batched: send its reads separately. An API key or OAuth client batches
        only operations of this reference; each item must be dispatched to the
        operation it names, else it answers `BATCH_UNKNOWN_ROUTE`. An item keeps
        its `Deprecation`, `Sunset`, `Link`, `Retry-After` and `Cache-Control`
        headers in `headers`.
      operationId: batch_reads
      parameters:
        - $ref: '#/components/parameters/WorkspaceId'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/BatchRequest'
        required: true
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BatchResponse'
          description: Every item's answer, in request order
          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: >-
            `BATCH_INVALID`, `BATCH_TOO_MANY_ITEMS`, `BATCH_METHOD_NOT_ALLOWED`,
            `BATCH_UNKNOWN_ROUTE`, `BATCH_ITEM_NOT_BATCHABLE`,
            `BATCH_SIGNED_REQUEST_UNSUPPORTED`, or `BATCH_EXCEEDS_RATE_BURST`
            when the credential's rate limit admits fewer requests at once than
            the batch holds; nothing ran
          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: ''
          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: This credential is not allowed to do this.
          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
        '413':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiError'
          description: '`REQUEST_BODY_TOO_LARGE`: the batch body is over 64 KiB'
          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: >-
            `RATE_LIMITED`: the caller's rate limit cannot cover every item;
            nothing ran
          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: Something went wrong on our side.
          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: '`BATCH_UNAVAILABLE`; nothing ran'
          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:
        - api_key: []
        - bearer_auth: []
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:
    BatchRequest:
      additionalProperties: false
      description: A batch of GET reads.
      properties:
        items:
          description: 1 to 20 reads, answered in this order.
          items:
            $ref: '#/components/schemas/BatchRequestItem'
          type: array
      required:
        - items
      type: object
    BatchResponse:
      description: The answers, one per item in request order.
      properties:
        items:
          items:
            $ref: '#/components/schemas/BatchResponseItem'
          type: array
      required:
        - items
      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
    BatchRequestItem:
      additionalProperties: false
      description: 'One read: a GET of a published route, written as its path and query.'
      properties:
        id:
          description: >-
            The caller's name for this read, 1 to 64 characters, unique in the
            batch; echoed in its answer.
          type: string
        method:
          description: '`GET`. Any other method is refused for the whole batch.'
          example: GET
          type: string
        url:
          description: >-
            Path and query, for example
            `/api/v1/workspaces/{workspaceId}/trades?limit=20`. It must be a

            GET operation of the published reference that answers JSON (no
            streams or CSV).
          type: string
      required:
        - id
        - method
        - url
      type: object
    BatchResponseItem:
      description: 'One item''s answer: what its GET answers as a separate request.'
      properties:
        body:
          description: >-
            The item GET's JSON body: its resource, or its error body on a
            refusal (the same error

            body every operation answers). `null` only when it sends no body.
          type:
            - object
            - 'null'
        etag:
          description: The item GET's `ETag`, when it sends one.
          type:
            - string
            - 'null'
        headers:
          additionalProperties:
            type: string
          description: >-
            The item's `Deprecation`, `Sunset`, `Link`, `Retry-After` and
            `Cache-Control` headers,

            lower-case names, when it sends any.
          propertyNames:
            type: string
          type:
            - object
            - 'null'
        id:
          description: The item's `id`.
          type: string
        status:
          description: The item GET's HTTP status.
          format: int32
          minimum: 0
          type: integer
      required:
        - id
        - status
        - etag
        - body
      type: object
    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.