{
  "openapi": "3.1.0",
  "info": {
    "title": "Seismic Orchestration API",
    "description": "REST API for on/off-ramp, KYC, stablecoin swaps, and wallets behind a single integration. Authenticate every request with the `Api-Key` header.",
    "license": {
      "name": "MIT",
      "identifier": "MIT"
    },
    "version": "0.1.0"
  },
  "servers": [
    {
      "url": "https://orchestration.seismic.systems/api",
      "description": "Production"
    },
    {
      "url": "https://orchestration.seismictest.net/api",
      "description": "Sandbox"
    }
  ],
  "paths": {
    "/v0/accounts": {
      "get": {
        "tags": [
          "Accounts"
        ],
        "summary": "List accounts",
        "operationId": "list_accounts_for_org",
        "parameters": [
          {
            "name": "origin",
            "in": "query",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/ApiAccountOrigin"
            }
          },
          {
            "name": "kind",
            "in": "query",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/ApiAccountKind"
            }
          },
          {
            "name": "currency",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "rail",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "status",
            "in": "query",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/ApiAccountStatus"
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "description": "Opaque cursor returned by a previous page (base64-encoded\n`(created_at, id)` tuple). Omit on the first request.",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "description": "Page size. Defaults to 50; max 200.",
            "required": false,
            "schema": {
              "type": "integer",
              "format": "int64"
            }
          },
          {
            "name": "customer_id",
            "in": "query",
            "description": "Only honored by `GET /accounts` — the per-customer endpoint\nalready scopes to the customer in the URL.",
            "required": false,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Accounts page; `next_cursor` is set when more remain.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ListAccountsResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "api_key": []
          }
        ]
      }
    },
    "/v0/accounts/fiat/external/requirements": {
      "get": {
        "tags": [
          "Accounts"
        ],
        "summary": "External fiat account requirements",
        "description": "The fields Seismic needs to register an external fiat account on this corridor. The response reflects the corridor's default configuration, which needs no caller identity — this endpoint needs no authentication. Pass `rail=swift` for SWIFT-specific USD requirements. A customer whose payout setup has been configured beyond that default can be asked for additional fields when the account is created.",
        "operationId": "get_external_fiat_requirements",
        "parameters": [
          {
            "name": "currency",
            "in": "query",
            "description": "Account currency (e.g. `USD`).",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "bank_country",
            "in": "query",
            "description": "ISO-2 country the destination bank account sits in.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "account_holder_type",
            "in": "query",
            "description": "`individual` or `business`.",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/AccountHolderKind"
            }
          },
          {
            "name": "rail",
            "in": "query",
            "description": "Intended settlement rail. Use `swift` to get the SWIFT identifier\nrecipe for a USD account at a US bank. Omit for the conservative\nunion across every eligible rail.",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The merged field recipe for the corridor.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ExternalFiatAccountRequirements"
                }
              }
            }
          },
          "400": {
            "description": "`bank_country` isn't a two-letter country code, or `account_holder_type` isn't `individual` / `business`.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "An external fiat account can't be created for this currency, bank country and `rail` (`CorridorUnsupported`).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/v0/accounts/{id}": {
      "get": {
        "tags": [
          "Accounts"
        ],
        "summary": "Get an account",
        "description": "Kind-agnostic single-account read — returns either the fiat or crypto shape; branch on `kind`.",
        "operationId": "get_account_by_id",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "description": "Account id.",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The account.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiAccount"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Account not found.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "api_key": []
          }
        ]
      },
      "delete": {
        "tags": [
          "Accounts"
        ],
        "summary": "Delete an account",
        "description": "Delete an account. The record is retained for audit but drops out of every read. Rejected while the account is referenced by an in-flight order or still holds a balance.",
        "operationId": "delete_account",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "description": "Account id.",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "Account deleted."
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Account not found.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "409": {
            "description": "Account has in-flight orders or a non-zero balance.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "api_key": []
          }
        ]
      }
    },
    "/v0/accounts/{id}/balance": {
      "get": {
        "tags": [
          "Accounts"
        ],
        "summary": "Get a virtual account's balance",
        "description": "Funds held in a virtual account, served from the snapshot Seismic keeps in sync as funds move.",
        "operationId": "get_account_balance",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "description": "Account id.",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The balance snapshot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiAccountBalance"
                }
              }
            }
          },
          "400": {
            "description": "The account is external — balances exist only for virtual accounts.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Account not found.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "api_key": []
          }
        ]
      }
    },
    "/v0/accounts/{id}/balance/refresh": {
      "post": {
        "tags": [
          "Accounts"
        ],
        "summary": "Refresh a virtual account's balance",
        "description": "Force a live re-read of a virtual account's balance. Rate-limited to once a minute per account; within the window the stored snapshot is returned unchanged.",
        "operationId": "refresh_account_balance",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "description": "Account id.",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The refreshed balance.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiAccountBalance"
                }
              }
            }
          },
          "400": {
            "description": "The account is external — balances exist only for virtual accounts.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Account not found.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "api_key": []
          }
        ]
      }
    },
    "/v0/accounts/{id}/liquidation": {
      "put": {
        "tags": [
          "Accounts"
        ],
        "summary": "Set an account's auto-liquidation target",
        "description": "Point an auto-liquidating virtual account at a different crypto account, or enable auto-liquidation on a virtual account created without it. Full-replace: `account_id` names the destination (an active crypto account of the same customer; its currency becomes the settlement currency), and an absent `developer_fee_bps` clears any configured fee. Enabling after creation is available only where the account supports it — `GET /customers/{id}/liquidation-destinations` reports whether auto-liquidation is supported for a customer and currency; where it isn't, a liquidation target can only be attached when the account is created. The destination must be the account holder's own wallet: a crypto account registered as a third party's is refused, and `GET /customers/{id}/liquidation-destinations` leaves it out. Returns the updated account.",
        "operationId": "update_account_liquidation",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "description": "Account id.",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/LiquidationInput"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "The account with its updated liquidation target.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiAccount"
                }
              }
            }
          },
          "400": {
            "description": "Auto-liquidation cannot be enabled on this account, the target is invalid (wrong customer, not active, registered as a third party's, or an unsupported fee), or the target could not be applied (the account is left unchanged).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Account not found.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "api_key": []
          }
        ]
      },
      "delete": {
        "tags": [
          "Accounts"
        ],
        "summary": "Turn off an account's auto-liquidation",
        "description": "Stop auto-liquidating a virtual account: the liquidation target and any developer fee are cleared, and future deposits stay in the account. A liquidation already in flight completes; only deposits arriving after the change are affected. Not every auto-liquidating account can be switched off — where it can't, the request is rejected and the configuration set at creation stays in place. Turning it off on an account that doesn't auto-liquidate is a no-op. Returns the updated account.",
        "operationId": "disable_account_liquidation",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "description": "Account id.",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The account with auto-liquidation turned off.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiAccount"
                }
              }
            }
          },
          "400": {
            "description": "Auto-liquidation on this account cannot be turned off.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Account not found.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "api_key": []
          }
        ]
      }
    },
    "/v0/currencies": {
      "get": {
        "tags": [
          "Reference data"
        ],
        "summary": "List currencies",
        "description": "Every currency Seismic can trade, with the rails each settles over and the general minimum payment size on each leg of a quote, where one applies. Unauthenticated.",
        "operationId": "list_currencies",
        "responses": {
          "200": {
            "description": "Currency catalog.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CurrenciesResp"
                }
              }
            }
          }
        },
        "security": [
          {}
        ]
      }
    },
    "/v0/customers": {
      "get": {
        "tags": [
          "Customers"
        ],
        "summary": "List customers",
        "description": "One page of the org's customers, newest first. Filter with `customer_type`, `status` or `pending_rfi`, and page with `cursor`. `next_cursor` is `null` on the last page; a filtered page is still a full page, so an empty `customers` array together with a null `next_cursor` is the only end-of-list signal.",
        "operationId": "list",
        "parameters": [
          {
            "name": "customer_type",
            "in": "query",
            "description": "Only individuals, or only businesses. Omit for both.",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/CustomerCategory"
            }
          },
          {
            "name": "status",
            "in": "query",
            "description": "Only customers whose rolled-up verification status is this one.",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/KyStatus"
            }
          },
          {
            "name": "pending_rfi",
            "in": "query",
            "description": "`true` for customers with an open request for information, `false`\nfor those without.",
            "required": false,
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "description": "`next_cursor` from the previous page. Omit on the first request.",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "description": "Page size. Defaults to 50, capped at 200.",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 0
            }
          }
        ],
        "responses": {
          "200": {
            "description": "One page of customers, newest first.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ListCustomersResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "api_key": []
          }
        ]
      },
      "post": {
        "tags": [
          "Customers"
        ],
        "summary": "Create a customer",
        "description": "Create an individual or business end customer, discriminated on `type`. The profile may be partial — fill it in later via `PUT /v0/customers/{id}/kyc/profile` or let the customer complete it through the returned hosted KYC link. Creation always leaves verification in draft; call `POST /v0/customers/{id}/kyc/submit` after the profile is complete.",
        "operationId": "create",
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "description": "Any unique string up to 256 characters. Replays with the same key return the originally created customer instead of creating a duplicate. Reusing a key with a different `type` is rejected with 409.",
            "required": false,
            "schema": {
              "type": [
                "string",
                "null"
              ]
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateCustomerRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "description": "Customer created; the hosted KYC link is included inline. A replayed `Idempotency-Key` returns the originally created customer.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CreateCustomerResponse"
                }
              }
            }
          },
          "400": {
            "description": "Malformed body, or `sandbox_auto_approve_kyc=true` outside sandbox.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "409": {
            "description": "The `Idempotency-Key` was previously used to create a customer of a different `type`. The error carries code `IdempotencyKeyConflict`.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "A referenced document id in the inline profile does not resolve to one of this customer's documents — the error carries the offending field path.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "api_key": []
          }
        ]
      }
    },
    "/v0/customers/address-requirements": {
      "get": {
        "tags": [
          "Customers"
        ],
        "summary": "Get address requirements for a country",
        "description": "Whether an address in `country` carries a state / region and a postal code, so a form can be shaped and validated before the profile is submitted. Values reflect the country's national address format: `required` must be sent, `optional` is accepted but never blocks, and `absent` means the country's format has no such field — omit it rather than sending an empty string. Requirements are country-scoped, not org-scoped, so the response is identical for every caller — this endpoint needs no authentication.",
        "operationId": "get_address_requirements",
        "parameters": [
          {
            "name": "country",
            "in": "query",
            "description": "ISO-3166-1 alpha-2 country the address sits in (e.g. `SG`).\nCase-insensitive.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The country's address field requirements.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AddressRequirementsResponse"
                }
              }
            }
          },
          "400": {
            "description": "`country` is not a two-letter country code.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        }
      }
    },
    "/v0/customers/orders": {
      "get": {
        "tags": [
          "Orders"
        ],
        "summary": "List orders",
        "description": "Cursor-paginated list of the organization's orders across every customer, newest first. Filter by status and by source / destination rail or schema; values repeat to OR within a side. Unknown rail, schema, or status names are rejected with a validation error.",
        "operationId": "list_org_orders",
        "parameters": [
          {
            "name": "source_rail",
            "in": "query",
            "description": "Match orders whose source rail is any of these. Repeat the parameter to pass several.",
            "required": false,
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          },
          {
            "name": "source_schema",
            "in": "query",
            "description": "Match orders whose source rail is in any of these schemas (see `GET /schemas`). OR'd with `source_rail`.",
            "required": false,
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          },
          {
            "name": "destination_rail",
            "in": "query",
            "description": "Match orders whose destination rail is any of these. Repeat the parameter to pass several.",
            "required": false,
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          },
          {
            "name": "destination_schema",
            "in": "query",
            "description": "Match orders whose destination rail is in any of these schemas (see `GET /schemas`). OR'd with `destination_rail`.",
            "required": false,
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          },
          {
            "name": "status",
            "in": "query",
            "description": "Match orders in this lifecycle status.",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/OrderStatus"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "description": "Page size. Defaults to 50; max 200.",
            "required": false,
            "schema": {
              "type": "integer",
              "format": "int64"
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "description": "Opaque cursor from the previous page's `next_cursor`. Omit on the first request.",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "funding_instructions",
            "in": "query",
            "description": "`v2` returns `funding_instructions` in one shape for every rail and\norder: `type`, `currency`, `amount` and `rail`, plus a `fiat` or\n`crypto` object. Without it, the details as received, whose keys\nvary; that shape will be retired.",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/FundingInstructionsVersion"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "One page of orders.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiOrderPage"
                }
              }
            }
          },
          "400": {
            "description": "Unknown rail, schema, or status name, or a malformed filter value.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "api_key": []
          }
        ]
      }
    },
    "/v0/customers/orders/{id}": {
      "get": {
        "tags": [
          "Orders"
        ],
        "summary": "Get an order",
        "operationId": "get_order",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "description": "Order id.",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "funding_instructions",
            "in": "query",
            "description": "`v2` returns `funding_instructions` in one shape for every rail and\norder: `type`, `currency`, `amount` and `rail`, plus a `fiat` or\n`crypto` object. Without it, the details as received, whose keys\nvary; that shape will be retired.",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/FundingInstructionsVersion"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The order.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiOrder"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Order not found.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "api_key": []
          }
        ]
      }
    },
    "/v0/customers/orders/{id}/cancel": {
      "post": {
        "tags": [
          "Orders"
        ],
        "summary": "Cancel an order",
        "description": "Abort an order that hasn't received funds yet. Orders past `awaiting_funds` / `pending` can no longer be canceled.",
        "operationId": "cancel_order",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "description": "Order id.",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "funding_instructions",
            "in": "query",
            "description": "`v2` returns `funding_instructions` in one shape for every rail and\norder: `type`, `currency`, `amount` and `rail`, plus a `fiat` or\n`crypto` object. Without it, the details as received, whose keys\nvary; that shape will be retired.",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/FundingInstructionsVersion"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The canceled order.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiOrder"
                }
              }
            }
          },
          "400": {
            "description": "This payment doesn't support cancellation.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Order not found.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "409": {
            "description": "Order is no longer cancelable.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "api_key": []
          }
        ]
      }
    },
    "/v0/customers/orders/{id}/documents": {
      "post": {
        "tags": [
          "Orders"
        ],
        "summary": "Submit a supporting document",
        "description": "File the supporting document a payment is waiting for: an order reading `status: under_review` with `status_reason` `documents_required`, or `documents_rejected` after a submitted document was turned down. The order moves to `documents_under_review` as the document is filed, so a retried or concurrent call answers 409 rather than filing twice; it reads `processing` with `documents_approved` once the payment continues. Each change after the filing fires `order.status_changed`.",
        "operationId": "submit_order_document",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "description": "Order id.",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "funding_instructions",
            "in": "query",
            "description": "`v2` returns `funding_instructions` in one shape for every rail and\norder: `type`, `currency`, `amount` and `rail`, plus a `fiat` or\n`crypto` object. Without it, the details as received, whose keys\nvary; that shape will be retired.",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/FundingInstructionsVersion"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SubmitOrderDocumentRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "The order, now `documents_under_review`.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiOrder"
                }
              }
            }
          },
          "400": {
            "description": "`file` is not a supported base64 data URI or exceeds 5 MB.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Order not found.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "409": {
            "description": "The order is not waiting for a supporting document.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "`type` is missing or not one of the supporting document types.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "api_key": []
          }
        ]
      }
    },
    "/v0/customers/{id}": {
      "get": {
        "tags": [
          "Customers"
        ],
        "summary": "Get a customer",
        "description": "The customer's saved profile plus their hosted KYC link. Identical to `GET /v0/customers/{id}/kyc/profile`.",
        "operationId": "get_customer",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "description": "Customer id.",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Profile envelope, discriminated on `type`.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CustomerProfileEnvelope"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Customer not found.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "api_key": []
          }
        ]
      },
      "delete": {
        "tags": [
          "Customers"
        ],
        "summary": "Delete a customer",
        "description": "Rejected while the customer has orders that aren't in a terminal state.",
        "operationId": "delete_customer",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "description": "Customer id.",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "Customer deleted."
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Customer not found.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "409": {
            "description": "Customer has in-flight orders.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "api_key": []
          }
        ]
      }
    },
    "/v0/customers/{id}/accounts": {
      "get": {
        "tags": [
          "Accounts"
        ],
        "summary": "List a customer's accounts",
        "operationId": "list_accounts_for_customer",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "description": "Customer id.",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "origin",
            "in": "query",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/ApiAccountOrigin"
            }
          },
          {
            "name": "kind",
            "in": "query",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/ApiAccountKind"
            }
          },
          {
            "name": "currency",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "rail",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "status",
            "in": "query",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/ApiAccountStatus"
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "description": "Opaque cursor returned by a previous page (base64-encoded\n`(created_at, id)` tuple). Omit on the first request.",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "description": "Page size. Defaults to 50; max 200.",
            "required": false,
            "schema": {
              "type": "integer",
              "format": "int64"
            }
          },
          {
            "name": "customer_id",
            "in": "query",
            "description": "Only honored by `GET /accounts` — the per-customer endpoint\nalready scopes to the customer in the URL.",
            "required": false,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Accounts page; `next_cursor` is set when more remain.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ListAccountsResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Customer not found.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "api_key": []
          }
        ]
      }
    },
    "/v0/customers/{id}/accounts/crypto/external": {
      "post": {
        "tags": [
          "Accounts"
        ],
        "summary": "Register an external crypto account",
        "description": "Register a wallet the customer already controls. The account materializes synchronously — `account` is populated in the response.",
        "operationId": "create_external_crypto",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "description": "Customer id.",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "description": "Any unique string up to 256 characters. Replays with the same key return the original request's outcome instead of creating a duplicate.",
            "required": false,
            "schema": {
              "type": [
                "string",
                "null"
              ]
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateExternalCryptoAccountRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Creation request plus the materialized account.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CreateAccountResponse"
                }
              }
            }
          },
          "400": {
            "description": "Malformed or invalid request body.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Customer not found.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "409": {
            "description": "The customer's verification is not approved, so no account can be opened for them yet, or a registration for the same address, currency, and rail is already in progress.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "api_key": []
          }
        ]
      }
    },
    "/v0/customers/{id}/accounts/crypto/{account_id}": {
      "get": {
        "tags": [
          "Accounts"
        ],
        "summary": "Get a crypto account",
        "operationId": "get_crypto_account",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "description": "Customer id.",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "account_id",
            "in": "path",
            "description": "Account id.",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The account.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiAccount"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Account not found.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "api_key": []
          }
        ]
      }
    },
    "/v0/customers/{id}/accounts/fiat/external": {
      "post": {
        "tags": [
          "Accounts"
        ],
        "summary": "Register an external fiat account",
        "description": "Register a bank account the customer already holds. The expected `details` shape is determined by currency, bank country, and the `rails` named; name `swift` for a USD SWIFT account at a US bank. `GET /v0/accounts/fiat/external/requirements` returns the live per-corridor recipe. The account materializes synchronously.",
        "operationId": "create_external_fiat",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "description": "Customer id.",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "description": "Any unique string up to 256 characters. Replays with the same key return the original request's outcome instead of creating a duplicate.",
            "required": false,
            "schema": {
              "type": [
                "string",
                "null"
              ]
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateExternalFiatAccountRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Creation request plus the materialized account.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CreateAccountResponse"
                }
              }
            }
          },
          "400": {
            "description": "Malformed body, `details` doesn't match the shape selected by currency, bank country, and rail, or `account_holder.is_third_party` is missing.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Customer not found.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "409": {
            "description": "The customer's verification is not approved, so no account can be opened for them yet, or a registration with the same bank details is already in progress.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "The account can't be registered: a third-party holder of a USD account left out `account_holder.relationship` (or, as a business on a USD account, `account_holder.industry`), with one `missing` violation per field; the corridor is unsupported; or the only settlement option doesn't accept the holder business's industry code. An industry code that isn't accepted comes back as a `not_in_allowed_set` violation on `account_holder.industry`, and when that code came from the customer's KYB profile, sending `account_holder.industry` sets the account's own. A first-party business account whose only option needs `account_holder.industry` is still created when neither the request nor the KYB profile has one; it is registered for settlement once they are added through `PATCH /v0/customers/{id}/accounts/fiat/{account_id}/holder`.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "api_key": []
          }
        ]
      }
    },
    "/v0/customers/{id}/accounts/fiat/virtual": {
      "post": {
        "tags": [
          "Accounts"
        ],
        "summary": "Create a virtual fiat account",
        "description": "Ask Seismic to provision a virtual bank account for the customer. Shape and rails are inferred from `currency` (`USD` → ACH + wire, `EUR` → SEPA + SWIFT, …). Pass `liquidation` to auto-convert incoming fiat to a crypto account.\n\nAn approved customer is not automatically cleared for every currency: virtual-account access is granted per currency, and `GET /v0/customers/{id}/virtual-account-approvals` reports where each one stands. Requesting a currency the customer is not cleared for returns `409 VirtualAccountNotApproved` — retrying will not change the answer until that clearance is granted.\n\nPass `bank` to say where the account is held, using a value from `GET /v0/customers/{id}/virtual-account-banks?currency={currency}`. Omit it and a bank is chosen for you. A bank the customer cannot be issued an account at returns `409 VirtualAccountBankNotAvailable` and creates nothing. Where the account has its own review, a bank that review has not cleared returns `409 VirtualAccountNotApproved` with the review's `status` instead, unless the request restores an account the customer deleted at that bank.\n\nA customer may hold one virtual bank account per bank in a currency, so a `bank` they hold no account at is not a duplicate of the account they already have. Omitting `bank` asks for an account in the currency rather than one at a particular bank, and is answered by whichever account they already hold.",
        "operationId": "create_virtual_fiat",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "description": "Customer id.",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "description": "Any unique string up to 256 characters. Replays with the same key return the original request's outcome instead of creating a duplicate.",
            "required": false,
            "schema": {
              "type": [
                "string",
                "null"
              ]
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateVirtualFiatAccountRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Creation request; `account` is `null` until provisioning completes.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CreateAccountResponse"
                }
              }
            }
          },
          "400": {
            "description": "Malformed or invalid request body.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Customer not found.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "409": {
            "description": "The customer's verification is not approved, they are not cleared for a virtual account in this currency, or the requested `bank` is not one they can be issued an account at.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "api_key": []
          }
        ]
      }
    },
    "/v0/customers/{id}/accounts/fiat/{account_id}": {
      "get": {
        "tags": [
          "Accounts"
        ],
        "summary": "Get a fiat account",
        "operationId": "get_fiat_account",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "description": "Customer id.",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "account_id",
            "in": "path",
            "description": "Account id.",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The account.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiAccount"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Account not found.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "api_key": []
          }
        ]
      }
    },
    "/v0/customers/{id}/accounts/fiat/{account_id}/holder": {
      "patch": {
        "tags": [
          "Accounts"
        ],
        "summary": "Update an external bank account's holder",
        "description": "Record the holder's relationship to the customer or the holder business's industry on an existing external bank account, for one created without them, or correct whether the account belongs to a third party. Send any of the fields; an omitted field is left unchanged, except that correcting `is_third_party` without a new `relationship` clears the old one. The account is then submitted again wherever it could not be registered before, which can open more routes to it; registrations that already exist are not changed. The response reflects the account as soon as those submissions answer or a short wait elapses.",
        "operationId": "update_external_fiat_holder",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "description": "Customer id.",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "account_id",
            "in": "path",
            "description": "External fiat account id.",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateExternalFiatHolderRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "The account, with the holder updated.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiAccount"
                }
              }
            }
          },
          "400": {
            "description": "No field sent, an industry not listed by `GET /v0/industries/account-holder`, an industry for a holder that is not a business, a relationship code not offered for the holder's type, or the account is closed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Account not found.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "api_key": []
          }
        ]
      }
    },
    "/v0/customers/{id}/accounts/fiat/{account_id}/rails": {
      "post": {
        "tags": [
          "Accounts"
        ],
        "summary": "Add a rail to an external bank account",
        "description": "Enable ACH or Wire on an active US USD external bank account. Existing rails remain available if the addition fails. Use the routing number the bank publishes for the requested rail. Where the account supports a separate routing number per rail, a number differing from the account's is registered for the rail being added and the rails already on the account keep theirs; where the account's rails share one routing number, a differing number is rejected. A rail that already holds a different routing number is not repointed.",
        "operationId": "add_external_fiat_rail",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "description": "Customer id.",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "account_id",
            "in": "path",
            "description": "Existing external fiat account id.",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "description": "Required unique key. Reuse it with the same account and body to replay the outcome.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AddExternalFiatRailRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Rail enabled or already available; the account id is unchanged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AddExternalFiatRailResponse"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input, unsupported addition, or the rail could not be enabled. Existing rails are unchanged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "api_key": []
          }
        ]
      }
    },
    "/v0/customers/{id}/accounts/requests": {
      "get": {
        "tags": [
          "Accounts"
        ],
        "summary": "Find an account creation request",
        "description": "Look up a creation request by the `Idempotency-Key` it was created with. Returns `null` when none matches.",
        "operationId": "find_account_creation_request",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "description": "Customer id.",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "idempotency_key",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The matching creation request, or `null`.",
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "type": "null"
                    },
                    {
                      "$ref": "#/components/schemas/ApiAccountCreationRequest"
                    }
                  ]
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Customer not found.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "api_key": []
          }
        ]
      }
    },
    "/v0/customers/{id}/accounts/requests/{request_id}": {
      "get": {
        "tags": [
          "Accounts"
        ],
        "summary": "Get an account creation request",
        "operationId": "get_account_creation_request",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "description": "Customer id.",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "request_id",
            "in": "path",
            "description": "Creation request id.",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The creation request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiAccountCreationRequest"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Request not found.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "api_key": []
          }
        ]
      }
    },
    "/v0/customers/{id}/kyc-link/rotate": {
      "post": {
        "tags": [
          "Customers"
        ],
        "summary": "Rotate the hosted KYC link",
        "description": "Overwrite the customer's hosted-link token in place — the old URL stops working immediately. Use after a suspected leak.",
        "operationId": "rotate",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "description": "Customer id.",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The fresh link.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HostedKycLink"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Customer not found.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "api_key": []
          }
        ]
      }
    },
    "/v0/customers/{id}/kyc/associated-persons/{person_id}/link-suggestions": {
      "get": {
        "tags": [
          "Customers"
        ],
        "summary": "Suggest customers to link an associated person to",
        "description": "Individual customers of yours whose identity matches an associated person on the business customer's verification profile — the same human onboarded twice. Send a suggested `customer_id` back on that person to link the two, so one verification covers both.",
        "operationId": "get_link_suggestions",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "description": "Business customer id.",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "person_id",
            "in": "path",
            "description": "Associated person id.",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Suggested customers, best-matched first.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LinkSuggestionsResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Customer or associated person not found.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "api_key": []
          }
        ]
      }
    },
    "/v0/customers/{id}/kyc/documents": {
      "get": {
        "tags": [
          "Customers"
        ],
        "summary": "List documents",
        "operationId": "list_documents",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "description": "Customer id.",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Document metadata, discriminated on `type`.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DocumentListResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Customer not found.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "api_key": []
          }
        ]
      },
      "post": {
        "tags": [
          "Customers"
        ],
        "summary": "Upload a document",
        "description": "Attach a supporting document (proof of address, bank statement, ID scan, …) to the customer — or, via `owner=person`, to one of a business customer's associated persons. 12 MB transport ceiling. A PDF longer than 20 pages is split: the first 20 pages are stored under the requested `kind` and returned here, and each further span of 20 pages is stored as an extra `other` document named `FILENAME_2.pdf`, `FILENAME_3.pdf`, …. When a business profile sets `addresses.operating_is_remote`, the beneficial owner whose residential address matches the operating address already evidences that address in their own section of the package, so a company `proof_of_address` upload with that document's file name returns the existing document instead of storing a copy, and one with a different file name is stored as `other` with the description \"Alternate proof of address for the company\".",
        "operationId": "upload_document",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "description": "Customer id.",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/DocumentUploadForm"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "The stored document's metadata, discriminated on `type`.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DocumentUploadResponse"
                }
              }
            }
          },
          "400": {
            "description": "Missing/invalid form field, unsupported file type, or a PDF longer than 200 pages.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Customer not found.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "413": {
            "description": "File exceeds the upload ceiling.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "api_key": []
          }
        ]
      }
    },
    "/v0/customers/{id}/kyc/documents/{doc_id}": {
      "get": {
        "tags": [
          "Customers"
        ],
        "summary": "Download a document",
        "operationId": "download_document",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "description": "Customer id.",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "doc_id",
            "in": "path",
            "description": "Document id.",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The document as uploaded where available. Otherwise a complete copy rebuilt from its stored pages, with a -reconstructed filename and X-Document-Reconstructed: true; or, when some pages can't be loaded, the available pages, with a -partial filename and X-Document-Partial: true. Downloading a document that holds part of a longer upload returns the whole upload.",
            "content": {
              "application/octet-stream": {
                "schema": {
                  "type": "array",
                  "items": {
                    "type": "integer",
                    "format": "int32",
                    "minimum": 0
                  }
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Document not found.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "api_key": []
          }
        ]
      },
      "delete": {
        "tags": [
          "Customers"
        ],
        "summary": "Delete a document",
        "operationId": "delete_document",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "description": "Customer id.",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "doc_id",
            "in": "path",
            "description": "Document id.",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "Document deleted."
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Document not found.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "api_key": []
          }
        ]
      }
    },
    "/v0/customers/{id}/kyc/profile": {
      "get": {
        "tags": [
          "Customers"
        ],
        "summary": "Get a customer's profile",
        "description": "The customer's saved profile plus their hosted KYC link. Identical to `GET /v0/customers/{id}`.",
        "operationId": "get_customer_profile",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "description": "Customer id.",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Profile envelope, discriminated on `type`.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CustomerProfileEnvelope"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Customer not found.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "api_key": []
          }
        ]
      },
      "put": {
        "tags": [
          "Customers"
        ],
        "summary": "Upsert a customer's profile",
        "description": "Save the profile — partial drafts are fine; validation runs at submit, not here. `kyc_link` is server-managed and absent from the request body.",
        "operationId": "set_customer",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "description": "Customer id.",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpsertCustomerProfileRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "The saved profile envelope.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CustomerProfileEnvelope"
                }
              }
            }
          },
          "400": {
            "description": "Malformed body, or `type` contradicts the customer's actual kind.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Customer not found.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "A referenced document id does not resolve to one of this customer's documents — the error carries the offending field path.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "api_key": []
          }
        ]
      }
    },
    "/v0/customers/{id}/kyc/resync": {
      "post": {
        "tags": [
          "Customers"
        ],
        "summary": "Resync verification state",
        "description": "Force a live re-read of the customer's verification status. Use when a webhook was missed; state normally stays fresh on its own.",
        "operationId": "resync",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "description": "Customer id.",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Refreshed state envelope.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CustomerStateEnvelope"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Customer not found.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "api_key": []
          }
        ]
      }
    },
    "/v0/customers/{id}/kyc/rfis": {
      "get": {
        "tags": [
          "Customers"
        ],
        "summary": "List open information requests",
        "description": "Open requests for more information on this customer's verification, as shown on the hosted verification form. Each item is answered through the answers endpoint with a written response, an uploaded document, or both; `kind` hints which one the request expects. `answered` is the read-only history of items already answered.",
        "operationId": "list_customer_rfis",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "description": "Customer id.",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Open requests, oldest first, plus the answered history.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OpenRfisResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Customer not found.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "api_key": []
          }
        ]
      }
    },
    "/v0/customers/{id}/kyc/rfis/answers": {
      "post": {
        "tags": [
          "Customers"
        ],
        "summary": "Answer open information requests",
        "description": "Record answers to items on this customer's open information requests. Each answer is a written response, a document already uploaded for this customer, or both. Each answer closes only the item it answers: items left unanswered stay open, and the customer's open requests read as answered once every item has an answer. Answers are reviewed before any profile change is made.",
        "operationId": "submit_customer_rfi_answers",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "description": "Customer id.",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SubmitRfiAnswersRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Answers recorded.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SubmitRfiAnswersResponse"
                }
              }
            }
          },
          "400": {
            "description": "Empty batch, an answer with neither text nor a document, blank or oversized text, or an unknown item.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Customer, request, or document not found.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "409": {
            "description": "The request is no longer open.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "api_key": []
          }
        ]
      }
    },
    "/v0/customers/{id}/kyc/state": {
      "get": {
        "tags": [
          "Customers"
        ],
        "summary": "Get verification state",
        "description": "Rolled-up KYC/KYB status, the hosted verification link, and any missing fields.",
        "operationId": "get_state",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "description": "Customer id.",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "State envelope, discriminated on `type`.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CustomerStateEnvelope"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Customer not found.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "api_key": []
          }
        ]
      }
    },
    "/v0/customers/{id}/kyc/submit": {
      "post": {
        "tags": [
          "Customers"
        ],
        "summary": "Submit for verification",
        "description": "Validate the saved profile and submit it for verification. In production, every submission is reviewed by Seismic before verification begins: the status reads `submitted` during that review and moves to `under_review` once verification starts. A submission the review declines reads `terminally_rejected` with a `rejection_reason`; that decision is final and further submissions are refused. In sandbox there is no review step. Submissions approve immediately and emit the corresponding status webhook by default; a customer created with `sandbox_auto_approve_kyc=false` instead advances through randomized asynchronous status updates. If a previous verification was rejected, correct the saved profile and submit again — Seismic re-submits the same customer with your changes rather than creating a duplicate. A repeat submit while one is already in flight returns the current state. An approved customer can be resubmitted too, but only by explicit opt-in: edit the saved profile, then submit with `?resubmit_approved=1` — the updated details are re-verified, and the status may move back to review until the re-check completes. Without the flag a submit never touches an approved verification; with the flag but no profile change it is a no-op that returns the current state.",
        "operationId": "submit",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "description": "Customer id.",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "resubmit_approved",
            "in": "query",
            "description": "Pass `1` / `true` / `yes` / `on` (case-insensitive) to also\nre-verify parts of the verification that are already approved, when\nthe saved profile changed since they were approved. Off by default:\na plain submit never disturbs an approved verification.",
            "required": false,
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "requestBody": {
          "description": "Optional. Records where the customer was when they accepted the terms of service.",
          "content": {
            "application/json": {
              "schema": {
                "oneOf": [
                  {
                    "type": "null"
                  },
                  {
                    "$ref": "#/components/schemas/SubmitRequest"
                  }
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "State after submission.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CustomerStateEnvelope"
                }
              }
            }
          },
          "400": {
            "description": "The supplied terms-acceptance context is unusable.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "The organization's KYB verification is not approved, so customers cannot be registered yet.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Customer not found.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "409": {
            "description": "Verification is paused by a compliance hold, or a resubmission carried no changes.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Profile incomplete — the error carries the missing field paths.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "api_key": []
          }
        ]
      }
    },
    "/v0/customers/{id}/kyc/sync-approvals": {
      "post": {
        "tags": [
          "Customers"
        ],
        "summary": "Sync verification approvals",
        "description": "Submit an already-verified customer for any verification checks added since they were onboarded, using their saved profile. Checks that already ran — approved, in review, or rejected — are left untouched, so calling this never disturbs an existing approval, and calling it when the customer is already up to date is a no-op that returns the current state. While a submission is still under Seismic's review, the call is also a no-op returning the current state — new checks start once the review completes. Expect requests for information (RFIs) by email while the new checks run; completion is announced by the `customer.kyc.status_changed` / `customer.kyb.status_changed` webhooks — for a customer already `approved`, the event fires with the status unchanged and `expanded: true` — after which newly available capabilities appear on the approvals endpoints.",
        "operationId": "sync_approvals",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "description": "Customer id.",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "State after syncing, discriminated on `type`.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CustomerStateEnvelope"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "The organization's KYB verification is not approved.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Customer not found, or never submitted for verification.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "409": {
            "description": "Verification is paused by a compliance hold, or a submission is already in progress.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Saved profile incomplete — the error carries the missing field paths.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "api_key": []
          }
        ]
      }
    },
    "/v0/customers/{id}/kyc/validation": {
      "get": {
        "tags": [
          "Customers"
        ],
        "summary": "Validate the saved profile",
        "description": "Runs the checks `POST /v0/customers/{id}/kyc/submit` runs on the saved profile, without submitting it: required fields, formats, and required documents. Returns `200` whether or not the profile passes, with the same `missing` and `violations` a failed submit would carry in its `422`. Nothing is saved or filed, and the verification status does not change. A customer with no saved profile validates as an empty one.",
        "operationId": "get_validation",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "description": "Customer id.",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The validation result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProfileValidation"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Customer not found.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "api_key": []
          }
        ]
      }
    },
    "/v0/customers/{id}/liquidation-destinations": {
      "get": {
        "tags": [
          "Accounts"
        ],
        "summary": "List eligible auto-liquidation destinations",
        "description": "Resolve, before creating a virtual fiat account, whether it could auto-liquidate and which of the customer's crypto accounts the sweep can settle to. `supported` reports whether auto-liquidation is available for this customer and `currency`; `destinations` lists the crypto accounts accepted as `liquidation.account_id` on the create — any other account is rejected there. Eligibility is resolved server-side from where the new account and each candidate destination are held, so it can change as accounts finish provisioning.",
        "operationId": "list_liquidation_destinations",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "description": "Customer id.",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "currency",
            "in": "query",
            "description": "Currency of the virtual fiat account being created (e.g. `USD`).",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Whether auto-liquidation is available, plus the eligible destinations.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LiquidationDestinationsResponse"
                }
              }
            }
          },
          "400": {
            "description": "Unknown currency.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Customer not found.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "api_key": []
          }
        ]
      }
    },
    "/v0/customers/{id}/orders": {
      "get": {
        "tags": [
          "Orders"
        ],
        "summary": "List a customer's orders",
        "description": "Cursor-paginated list of one customer's orders, newest first. Same filters and pagination as `GET /customers/orders`.",
        "operationId": "list_customer_orders",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "description": "Customer id.",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "source_rail",
            "in": "query",
            "description": "Match orders whose source rail is any of these. Repeat the parameter to pass several.",
            "required": false,
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          },
          {
            "name": "source_schema",
            "in": "query",
            "description": "Match orders whose source rail is in any of these schemas (see `GET /schemas`). OR'd with `source_rail`.",
            "required": false,
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          },
          {
            "name": "destination_rail",
            "in": "query",
            "description": "Match orders whose destination rail is any of these. Repeat the parameter to pass several.",
            "required": false,
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          },
          {
            "name": "destination_schema",
            "in": "query",
            "description": "Match orders whose destination rail is in any of these schemas (see `GET /schemas`). OR'd with `destination_rail`.",
            "required": false,
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          },
          {
            "name": "status",
            "in": "query",
            "description": "Match orders in this lifecycle status.",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/OrderStatus"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "description": "Page size. Defaults to 50; max 200.",
            "required": false,
            "schema": {
              "type": "integer",
              "format": "int64"
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "description": "Opaque cursor from the previous page's `next_cursor`. Omit on the first request.",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "funding_instructions",
            "in": "query",
            "description": "`v2` returns `funding_instructions` in one shape for every rail and\norder: `type`, `currency`, `amount` and `rail`, plus a `fiat` or\n`crypto` object. Without it, the details as received, whose keys\nvary; that shape will be retired.",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/FundingInstructionsVersion"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "One page of the customer's orders.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiOrderPage"
                }
              }
            }
          },
          "400": {
            "description": "Unknown rail, schema, or status name, or a malformed filter value.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Customer not found.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "api_key": []
          }
        ]
      }
    },
    "/v0/customers/{id}/pay-in-approvals": {
      "get": {
        "tags": [
          "Customers"
        ],
        "summary": "List pay-in approvals",
        "description": "The currency + rail combinations this customer may be funded with. Only entries with status `approved` can carry a payment — quoting an unapproved one fails. Narrowed to the currencies and rails your organization is approved for, and each currency is answered by the payment setup configured for it. Approvals are cached for up to an hour, and a currency's own virtual-account review for 45 seconds to 5 minutes depending on where it stands, so a freshly granted approval can take that long to appear.",
        "operationId": "get_pay_in_approvals",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "description": "Customer id.",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The customer's pay-in approvals.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PayInApprovalsResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Customer not found.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "503": {
            "description": "Approvals are unavailable on this environment.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "api_key": []
          }
        ]
      }
    },
    "/v0/customers/{id}/payout-approvals": {
      "get": {
        "tags": [
          "Customers"
        ],
        "summary": "List payout approvals",
        "description": "The currency + rail + country combinations this customer may be paid out to. Only entries with status `approved` can carry a payment. Narrowed to the currencies and rails your organization is approved for; each combination reports the best standing across the payment setups able to settle it. Cached for up to an hour.",
        "operationId": "get_payout_approvals",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "description": "Customer id.",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The customer's payout approvals.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PayoutApprovalsResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Customer not found.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "503": {
            "description": "Approvals are unavailable on this environment.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "api_key": []
          }
        ]
      }
    },
    "/v0/customers/{id}/virtual-account-approvals": {
      "get": {
        "tags": [
          "Customers"
        ],
        "summary": "List virtual-account approvals",
        "description": "Every virtual account this customer can be issued — currency, country, backing bank, and its maintenance fee where one applies — with the review status of each. Only entries with status `approved` can be opened today. Narrowed to the currencies your organization is approved for. Where a currency has its own virtual-account review, an entry per bank reports where that review stands at the bank; `not_started` there means an approval that covers other banks, and is resolved by that review rather than by `POST /v0/customers/{id}/kyc/sync-approvals`. Otherwise `not_started` means the customer has never been verified for the account type; if they were onboarded before it became available, `sync-approvals` starts the missing verification. Where the account has its own review, a create at a bank whose entry is not `approved` is refused with `VirtualAccountNotApproved`; elsewhere such a bank is `VirtualAccountBankNotAvailable`. Approvals are cached for up to an hour, and a currency's own virtual-account review for 45 seconds to 5 minutes depending on where it stands, so a freshly granted approval can take that long to appear.",
        "operationId": "get_virtual_account_approvals",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "description": "Customer id.",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The customer's virtual-account approvals.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VirtualAccountApprovalsResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Customer not found.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "503": {
            "description": "Virtual-account approvals are unavailable on this environment.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "api_key": []
          }
        ]
      }
    },
    "/v0/customers/{id}/virtual-account-banks": {
      "get": {
        "tags": [
          "Customers"
        ],
        "summary": "List selectable virtual-account banks",
        "description": "The banks this customer can be issued a virtual account at in `currency`, right now, in display order. Send one of these as `bank` when creating the virtual account to choose where it is held; omit `bank` and a bank is chosen for you.\n\nThe order is the same one `GET /v0/virtual-account-banks` serves the whole catalog in — render the list as it arrives.\n\nOnly banks the customer is already cleared for are listed, so an empty list is a normal answer. It can mean there is no choice to make for this customer and currency, or that the customer's virtual-account review has not cleared any bank yet — in which case a create naming no bank is refused with `VirtualAccountNotApproved`, naming where the review stands. `GET /v0/customers/{id}/virtual-account-approvals` shows where each clearance stands. Clearances are cached for up to an hour, and a currency's own virtual-account review for 45 seconds to 5 minutes depending on where it stands, so a freshly granted one can take that long to appear.",
        "operationId": "get_virtual_account_banks",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "description": "Customer id.",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "currency",
            "in": "query",
            "description": "Currency the account would collect in (e.g. `USD`). Case-insensitive.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Banks the customer can select.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VirtualAccountBanksResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Customer not found.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "api_key": []
          }
        ]
      }
    },
    "/v0/deposits": {
      "get": {
        "tags": [
          "Accounts"
        ],
        "summary": "List deposits",
        "description": "Deposits credited to virtual accounts outside the order flow, newest first — the read-side twin of the `account.deposit_received` webhook event, for reconciliation.",
        "operationId": "list_deposits",
        "parameters": [
          {
            "name": "account_id",
            "in": "query",
            "description": "Narrow to deposits credited to a single account.",
            "required": false,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "customer_id",
            "in": "query",
            "description": "Narrow to deposits across a single customer's accounts.",
            "required": false,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "kind",
            "in": "query",
            "description": "Narrow to fiat or crypto deposits.",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/ApiAccountKind"
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "description": "Opaque cursor returned by a previous page (`next_cursor`). Omit\non the first request.",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "description": "Page size. Defaults to 50; max 200.",
            "required": false,
            "schema": {
              "type": "integer",
              "format": "int64"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Deposits page; `next_cursor` is set when more remain.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ListAccountDepositsResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "api_key": []
          }
        ]
      }
    },
    "/v0/industries": {
      "get": {
        "tags": [
          "Reference data"
        ],
        "summary": "List industries",
        "description": "The NAICS industry catalog accepted by the KYB `business.industry` field, as a bare array sorted by code. Unauthenticated.",
        "operationId": "list_industries",
        "responses": {
          "200": {
            "description": "Industry catalog.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/NaicsIndustry"
                  }
                }
              }
            }
          }
        },
        "security": [
          {}
        ]
      }
    },
    "/v0/industries/account-holder": {
      "get": {
        "tags": [
          "Reference data"
        ],
        "summary": "List account holder industries",
        "description": "The industries an external account's `account_holder.industry` accepts on a bank account, as a bare array sorted by code: those usable as a payout destination on every route. A subset of `GET /v0/industries`, currently all of it; a code outside this list is rejected on bank account create and holder update. Unauthenticated.",
        "operationId": "list_account_holder_industries",
        "responses": {
          "200": {
            "description": "Account holder industry catalog.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/NaicsIndustry"
                  }
                }
              }
            }
          }
        },
        "security": [
          {}
        ]
      }
    },
    "/v0/industries/mappings": {
      "get": {
        "tags": [
          "Reference data"
        ],
        "summary": "List industry mappings",
        "description": "Everything needed to translate an arbitrary NAICS code in one request: `supported` lists the codes `business.industry` accepts as-is, and `mappings` pairs every 2022 NAICS code outside that catalog with the accepted code closest to it, sorted by `from`. A `low` confidence row is a related but materially different industry — confirm it with the business rather than applying it automatically. Unauthenticated.",
        "operationId": "list_industry_mappings",
        "responses": {
          "200": {
            "description": "Industry mappings.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NaicsIndustryMappings"
                }
              }
            }
          }
        },
        "security": [
          {}
        ]
      }
    },
    "/v0/liquidations": {
      "get": {
        "tags": [
          "Accounts"
        ],
        "summary": "List liquidations",
        "description": "Auto-liquidations of virtual-account deposits, newest first — the read-side twin of the `account.deposit_liquidated` webhook event, for reconciliation. `deposit_id` links each liquidation back to the deposit that funded it.",
        "operationId": "list_liquidations",
        "parameters": [
          {
            "name": "account_id",
            "in": "query",
            "description": "Narrow to liquidations draining a single account.",
            "required": false,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "customer_id",
            "in": "query",
            "description": "Narrow to liquidations across a single customer's accounts.",
            "required": false,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "deposit_id",
            "in": "query",
            "description": "Narrow to the liquidation(s) of a single deposit.",
            "required": false,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "description": "Opaque cursor returned by a previous page (`next_cursor`). Omit\non the first request.",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "description": "Page size. Defaults to 50; max 200.",
            "required": false,
            "schema": {
              "type": "integer",
              "format": "int64"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Liquidations page; `next_cursor` is set when more remain.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ListAccountLiquidationsResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "api_key": []
          }
        ]
      }
    },
    "/v0/org/settings": {
      "get": {
        "tags": [
          "Organization"
        ],
        "summary": "Read organization settings",
        "description": "The settings this organization manages itself. Every setting reads as its default until set.",
        "operationId": "get_settings",
        "responses": {
          "200": {
            "description": "Current settings.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OrgSettings"
                }
              }
            }
          }
        },
        "security": [
          {
            "api_key": []
          }
        ]
      },
      "patch": {
        "tags": [
          "Organization"
        ],
        "summary": "Update organization settings",
        "description": "Updates the settings named in the body; settings left out keep their current value. A new default developer fee applies to virtual accounts created or retargeted from then on; existing accounts keep the fee they were opened with. Owner or admin role required.",
        "operationId": "patch_settings",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/OrgSettingsPatch"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Stored settings.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OrgSettings"
                }
              }
            }
          },
          "400": {
            "description": "A value is out of range.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Owner or admin role required.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "api_key": []
          }
        ]
      }
    },
    "/v0/payment-reasons": {
      "get": {
        "tags": [
          "Reference data"
        ],
        "summary": "List payment reasons",
        "description": "Every reason a payment can carry — the closed set accepted on the `payment_reason` field when accepting a quote. Unauthenticated.",
        "operationId": "list_payment_reasons",
        "responses": {
          "200": {
            "description": "Payment-reason catalog.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaymentReasonsResp"
                }
              }
            }
          }
        },
        "security": [
          {}
        ]
      }
    },
    "/v0/quotes": {
      "post": {
        "tags": [
          "Quotes"
        ],
        "summary": "Create a quote",
        "description": "Price the requested trade across every eligible rail and return a snapshot ranked best-first. With `?wait=1` the call blocks until pricing completes; otherwise it returns a `pending` snapshot to poll via `GET /v0/quotes/{id}`. With `?named=1` only named options are returned and accepted: the payment reaches the beneficiary under the end customer's own legal name.",
        "operationId": "create_quote",
        "parameters": [
          {
            "name": "wait",
            "in": "query",
            "description": "Pass `1` / `true` / `yes` / `on` (case-insensitive) to block\nuntil pricing completes. Otherwise the pending snapshot returns\nimmediately — poll `GET /v0/quotes/{id}` for results.",
            "required": false,
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "named",
            "in": "query",
            "description": "`1`, `true`, `yes` or `on` (case-insensitive) to price and offer only\nnamed options: the payment reaches the beneficiary under the end\ncustomer's own legal name. Only routes that can be named are priced,\nso the best quote is the best named one, and accepting the quote only\never takes a named option. `0`, `false`, `no` or `off`, or omitting\nit, returns every option, each reporting `is_named`. Any other value,\nincluding a bare `?named`, is a `400`.\n\nIf none of the routes that will price the payment can be named, the\nrequest fails at once with `422 NoNamedQuote` and no snapshot is\ncreated (a retryable `503` when such a route was only briefly\nunavailable). A `pending` snapshot lists no options until\npricing finishes. Once it does (in this response with `wait`, or on a\nlater `GET /v0/quotes/{id}`) without a named option, the snapshot\nreturns the error of a named route that failed (the same error a\nrequest without `named` returns when every option fails; a `503`\nwithout `Retry-After` when a named route couldn't be priced right\nnow), or `422 NoNamedQuote` when no named route priced. Either way the\nsnapshot won't change: create a new quote.",
            "required": false,
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateQuoteBody"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Quote snapshot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AsyncQuoteSnapshot"
                }
              }
            }
          },
          "400": {
            "description": "Malformed or invalid request body, a `named` value other than `1`, `true`, `yes`, `on`, `0`, `false`, `no` or `off` (case-insensitive), or an end customer whose verification isn't yet approved for any route that could settle the payment.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "`end_customer_id` is unknown.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "No rail supports the requested corridor, or no rate is available, or `?named=1` was passed and no eligible route can be named (`NoNamedQuote`). Also returned when `destination.account` is an external bank account that isn't registered for payouts yet because its holder is missing `account_holder.relationship` or `account_holder.industry`: one `missing` violation per field, and the message links the account's dashboard page and names the `PATCH …/holder` call, either of which adds them.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "503": {
            "description": "With `Retry-After`, nothing was stored and the same request can be retried after it (with `?named=1`, the routes that could be named were briefly unavailable). Without, the `wait=1` snapshot is final but could not be fully priced: create a new quote.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "api_key": []
          }
        ]
      }
    },
    "/v0/quotes/requirements": {
      "get": {
        "tags": [
          "Quotes"
        ],
        "summary": "Get pre-quote document requirements",
        "description": "Supporting-document policy for a destination currency, by name or numeric id. Unauthenticated; no customer, account, amount, or quote is needed. Conditional thresholds use the destination amount; route_conditions name payout routes that require a document at any amount for a third-party beneficiary; bank_country_conditions name beneficiary bank countries where a payout can require one at any amount, in any currency. Read the selected priced quote's acceptance_requirements.files_required for the evaluated result. This policy does not establish corridor eligibility; additional documents may be requested during processing.",
        "operationId": "get_quote_requirements",
        "parameters": [
          {
            "name": "currency",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "example": "BRL"
          }
        ],
        "responses": {
          "200": {
            "description": "Document policy for the destination currency.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuoteRequirements"
                }
              }
            }
          },
          "400": {
            "description": "Missing currency parameter."
          },
          "404": {
            "description": "Unknown currency.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {}
        ]
      }
    },
    "/v0/quotes/{id}": {
      "get": {
        "tags": [
          "Quotes"
        ],
        "summary": "Get a quote snapshot",
        "description": "Re-read a stored snapshot — poll until `status` leaves `pending`.",
        "operationId": "get_quote",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "description": "Quote snapshot id.",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Quote snapshot.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AsyncQuoteSnapshot"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Snapshot id unknown.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "The snapshot was created with `?named=1` and finished without a named option (`NoNamedQuote`); create a new quote. A named route that failed returns its own error instead.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "503": {
            "description": "The snapshot is final but could not be fully priced (an unverifiable minimum, or a route that was briefly unavailable). No `Retry-After` is sent: create a new quote.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "api_key": []
          }
        ]
      }
    },
    "/v0/quotes/{id}/accept": {
      "post": {
        "tags": [
          "Quotes"
        ],
        "summary": "Accept a quote",
        "description": "Turn a snapshot into an order. The body is optional — a bodyless `POST` (or `{}`) accepts the snapshot's best-ranked quote.",
        "operationId": "accept_quote",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "description": "Quote snapshot id.",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "description": "Any unique string up to 256 characters, generally a UUID. Replays of the same snapshot id + key resolve to the same order instead of `AlreadyAccepted`. Recommended for callers doing automatic retries.",
            "required": false,
            "schema": {
              "type": [
                "string",
                "null"
              ]
            }
          },
          {
            "name": "funding_instructions",
            "in": "query",
            "description": "`v2` returns `funding_instructions` in one shape for every rail and\norder: `type`, `currency`, `amount` and `rail`, plus a `fiat` or\n`crypto` object. Without it, the details as received, whose keys\nvary; that shape will be retired.",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/FundingInstructionsVersion"
            }
          }
        ],
        "requestBody": {
          "description": "Optional — omit to accept the best-ranked quote.",
          "content": {
            "application/json": {
              "schema": {
                "oneOf": [
                  {
                    "type": "null"
                  },
                  {
                    "$ref": "#/components/schemas/AcceptQuoteRequest"
                  }
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The created order, returned inline — no follow-up read needed for `funding_instructions` or lifecycle status.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AcceptQuoteResult"
                }
              }
            }
          },
          "400": {
            "description": "Malformed body (including a `files` entry without a `type`), `quote_id` isn't in the snapshot, `expired_quote_behavior` isn't in the chosen quote's `supported_expired_quote_behaviors`, or the end customer's verification no longer covers the chosen quote's route.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid API key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Snapshot id unknown.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "409": {
            "description": "Snapshot already accepted with a different `Idempotency-Key` (or none) (`AlreadyAccepted`), or the `Idempotency-Key` was already used to accept a different snapshot (`IdempotencyKeyConflict`): send a new key for each quote.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "422": {
            "description": "Snapshot still `pending`, the chosen quote expired, or the snapshot was created with `?named=1` and offers no named option (`NoNamedQuote`; a named route that failed returns its own error instead).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "502": {
            "description": "The payment failed upstream; contact support rather than retrying in a loop.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "503": {
            "description": "With `Retry-After`, a dependency is temporarily unavailable: retry after it. Without, the snapshot is final but could not be fully priced: create a new quote.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "api_key": []
          }
        ]
      }
    },
    "/v0/rails": {
      "get": {
        "tags": [
          "Reference data"
        ],
        "summary": "List rails",
        "description": "Every rail Seismic settles over. Unauthenticated.",
        "operationId": "list_rails",
        "responses": {
          "200": {
            "description": "Rail catalog.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RailsResp"
                }
              }
            }
          }
        },
        "security": [
          {}
        ]
      }
    },
    "/v0/rates": {
      "get": {
        "tags": [
          "Reference data"
        ],
        "summary": "List mid-market rates",
        "description": "Mid-market reference rates for spread disclosure and converter widgets — quotes already settle trades, this surfaces the reference price. Unauthenticated.",
        "operationId": "list_rates",
        "parameters": [
          {
            "name": "from",
            "in": "query",
            "description": "Source currency. Defaults to `USD`.",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "to",
            "in": "query",
            "description": "Destination currency. Omit to list every cached pair from\n`from`.",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "from_rail",
            "in": "query",
            "description": "Blockchain rail for a stablecoin `from` leg (e.g. `base`,\n`ethereum`). Ignored for fiat. Defaults to the stablecoin's\nprimary chain when omitted.",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "to_rail",
            "in": "query",
            "description": "Blockchain rail for a stablecoin `to` leg. Ignored for fiat.",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "to_country",
            "in": "query",
            "description": "ISO-2 settlement country for a fiat `to` leg (e.g. `DE`).\nRequired by some corridors; defaults to the currency's primary\nsettlement country when omitted. Ignored for stablecoin `to`.",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Resolved rates — a single entry when `to` is pinned, otherwise every cached pair from `from`.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RatesResponse"
                }
              }
            }
          },
          "400": {
            "description": "Unknown query field or unsupported pair.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {}
        ]
      }
    },
    "/v0/sandbox/accounts/{id}/capabilities": {
      "get": {
        "tags": [
          "Accounts"
        ],
        "summary": "Get sandbox wallet capabilities",
        "operationId": "capabilities",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "description": "Account id.",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Sandbox wallet capabilities.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SandboxAccountCapabilities"
                }
              }
            }
          },
          "401": {
            "description": "Authentication required.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Account or sandbox operation unavailable.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "api_key": []
          }
        ]
      }
    },
    "/v0/sandbox/accounts/{id}/deposits": {
      "post": {
        "tags": [
          "Accounts"
        ],
        "summary": "Simulate a sandbox fiat deposit",
        "description": "Sandbox only. Credits an active virtual fiat account and emits the usual deposit event. Reuse the same Idempotency-Key and payload when retrying. Deposits remain as balance unless matched to a payment or swept by configured automatic liquidation.",
        "operationId": "deposit",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "description": "Account id.",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "description": "Required retry key scoped to organization and account.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SandboxDepositRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Deposit accepted.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SandboxDepositResponse"
                }
              }
            }
          },
          "400": {
            "description": "Invalid amount, currency, account, or retry key.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Authentication required.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Account or sandbox operation unavailable.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "409": {
            "description": "Retry key already used with a different payload.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "api_key": []
          }
        ]
      }
    },
    "/v0/sandbox/accounts/{id}/replacement": {
      "post": {
        "tags": [
          "Accounts"
        ],
        "summary": "Create a sandbox wallet replacement",
        "description": "Creates an unfunded replacement wallet for an eligible historical sandbox account. The historical account and its transaction history are preserved. Repeated requests return the same replacement.",
        "operationId": "replace",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "description": "Historical account id.",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "description": "Required retry key.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Replacement wallet available.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SandboxAccountReplacement"
                }
              }
            }
          },
          "400": {
            "description": "Account is not eligible or a retry key is missing.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Authentication required.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Account or sandbox operation unavailable.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "api_key": []
          }
        ]
      }
    },
    "/v0/sandbox/customers/{id}/kyc/rejection": {
      "post": {
        "tags": [
          "Customers"
        ],
        "summary": "Reject a sandbox customer's verification",
        "description": "Sandbox only. Replaces the automatic approval of a customer whose KYC or KYB was submitted: status webhooks move it through submitted and under review to rejected, with `rejection_reason` as the reason, as a real decision would. Edit the profile and submit again to have it approved.",
        "operationId": "kyc_rejection",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "description": "Customer id.",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SandboxKycRejectionRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "204": {
            "description": "Rejection scheduled."
          },
          "401": {
            "description": "Authentication required.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Customer not found, its verification not yet submitted, or sandbox operation unavailable.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "api_key": []
          }
        ]
      }
    },
    "/v0/sandbox/customers/{id}/kyc/rfi": {
      "post": {
        "tags": [
          "Customers"
        ],
        "summary": "Request information from a sandbox customer",
        "description": "Sandbox only. Raises a request for information on a customer whose KYC or KYB was submitted, as a reviewer would: the customer reads `under_review` with `pending_rfi: true`, the items are listed by `GET /customers/{id}/kyc/rfis`, and the request is emailed to the organization's compliance contact. Answering every item through `POST /customers/{id}/kyc/rfis/answers` or the hosted link approves the customer a few seconds later.",
        "operationId": "kyc_rfi",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "description": "Customer id.",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SandboxRfiRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "204": {
            "description": "Request raised."
          },
          "400": {
            "description": "No items, more than 20, or an item longer than 5000 characters.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Authentication required.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Customer not found, its verification not yet submitted, or sandbox operation unavailable.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "409": {
            "description": "The organization has no compliance email to send the request to.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "api_key": []
          }
        ]
      }
    },
    "/v0/sandbox/deposit-currencies": {
      "get": {
        "tags": [
          "Accounts"
        ],
        "summary": "List sandbox deposit currencies",
        "description": "Sandbox only. Lists currencies supported for simulated virtual-account deposits and payment funding. A deposit requires an eligible existing account or accepted payment in the selected currency. Account and payment creation remain subject to the organization's permissions.",
        "operationId": "deposit_currencies",
        "responses": {
          "200": {
            "description": "Supported deposit currencies.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SandboxDepositCurrenciesResponse"
                }
              }
            }
          },
          "401": {
            "description": "Authentication required.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Sandbox operation unavailable.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "api_key": []
          }
        ]
      }
    },
    "/v0/sandbox/deposits/{id}/return": {
      "post": {
        "tags": [
          "Accounts"
        ],
        "summary": "Return a sandbox fiat deposit",
        "description": "Sandbox only. Sends a simulated fiat deposit back to its sender, as a bank return would: the deposit moves to `refunded` with `reason` as its `status_reason`, `deposit.status_changed` (and the deprecated `account.deposit_returned`) fire, and the account balance drops by the amount, to no lower than zero when the funds were already used. A deposit that was already liquidated can't be returned, as in production. Repeating the call changes nothing.",
        "operationId": "deposit_return",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "description": "Deposit id.",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SandboxDepositReturnRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "204": {
            "description": "Return scheduled."
          },
          "400": {
            "description": "The deposit is not a fiat deposit, was already returned or failed, or was already liquidated.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Authentication required.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Deposit not found, or sandbox operation unavailable.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "api_key": []
          }
        ]
      }
    },
    "/v0/sandbox/orders/{id}/funding": {
      "post": {
        "tags": [
          "Quotes"
        ],
        "summary": "Simulate funding of a sandbox fiat payment",
        "description": "Sandbox only. Simulates receipt of the full quoted fiat amount for an unfunded fiat-to-crypto payment, up to 1000000 in the source currency. Settlement proceeds asynchronously; track the payment status and webhooks for completion. Read GET /v0/sandbox/deposit-currencies for supported currencies. Reuse the same Idempotency-Key on retries. Does not credit a virtual account or simulate a real bank transfer.",
        "operationId": "fund_order",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "description": "Accepted order id.",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "description": "Required retry key scoped to organization and order.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Test funding accepted. This does not confirm settlement.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SandboxOrderFundingResponse"
                }
              }
            }
          },
          "400": {
            "description": "Unsupported payment or invalid funding amount.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "401": {
            "description": "Authentication required.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Order or sandbox operation unavailable.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "409": {
            "description": "Order already funded or no longer awaiting funds.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "api_key": []
          }
        ]
      }
    },
    "/v0/sandbox/settlement-assets": {
      "get": {
        "tags": [
          "Sandbox"
        ],
        "summary": "List organization sandbox settlement selections",
        "description": "An empty list means the default settlement assets apply. Existing accounts keep their original token identity.",
        "operationId": "list",
        "responses": {
          "200": {
            "description": "Explicit organization selections.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/SandboxSettlementAsset"
                  }
                }
              }
            }
          },
          "404": {
            "description": "Sandbox operation unavailable.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "api_key": []
          }
        ]
      },
      "put": {
        "tags": [
          "Sandbox"
        ],
        "summary": "Configure an organization sandbox settlement asset",
        "description": "Selects an enabled token for a chain and currency. New accounts inherit the selection. Existing accounts and orders are preserved; complete existing token identities may differ from the new selection. Incomplete token identities or a different existing selection require reconciliation. Tokens without automatic funding must be funded externally.",
        "operationId": "configure",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SandboxSettlementAsset"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Selection configured.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SandboxSettlementAsset"
                }
              }
            }
          },
          "400": {
            "description": "Unsupported selection or account migration required.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "403": {
            "description": "Organization administrator required.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          },
          "404": {
            "description": "Sandbox operation unavailable.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "api_key": []
          }
        ]
      }
    },
    "/v0/sandbox/settlement-assets/catalog": {
      "get": {
        "tags": [
          "Sandbox"
        ],
        "summary": "List enabled sandbox settlement tokens",
        "operationId": "catalog",
        "responses": {
          "200": {
            "description": "Enabled tokens and funding capabilities.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/SandboxSettlementToken"
                  }
                }
              }
            }
          },
          "404": {
            "description": "Sandbox operation unavailable.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                }
              }
            }
          }
        },
        "security": [
          {
            "api_key": []
          }
        ]
      }
    },
    "/v0/schemas": {
      "get": {
        "tags": [
          "Reference data"
        ],
        "summary": "List schemas",
        "description": "Named groups of rails — e.g. `us_bank` expands to `ach` / `wire` / `swift` — accepted anywhere a quote leg takes `schemas`. Unauthenticated.",
        "operationId": "list_schemas",
        "responses": {
          "200": {
            "description": "Schema catalog.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SchemasResponse"
                }
              }
            }
          }
        },
        "security": [
          {}
        ]
      }
    },
    "/v0/soc-codes": {
      "get": {
        "tags": [
          "Reference data"
        ],
        "summary": "List occupation codes",
        "description": "The SOC occupation catalog accepted by the KYC `employment.occupation_soc` field, as a bare array sorted by code. Codes follow the U.S. Bureau of Labor Statistics 2018 Standard Occupational Classification and take the form `NN-NNNN`. Unauthenticated.",
        "operationId": "list_soc_codes",
        "responses": {
          "200": {
            "description": "Occupation catalog.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/SocCode"
                  }
                }
              }
            }
          }
        },
        "security": [
          {}
        ]
      }
    },
    "/v0/virtual-account-banks": {
      "get": {
        "tags": [
          "Reference data"
        ],
        "summary": "List virtual-account banks",
        "description": "Every bank a virtual account can be opened at, as a bare array in display order: the banks that accept third-party payments first, then the ones that accept only the holder's own payment. Render the list in the order it arrives.\n\nThis is the whole catalog, not what one customer can select. `GET /v0/customers/{id}/virtual-account-banks` narrows it to the banks a given customer is cleared for in a currency, in this same order. Unauthenticated.",
        "operationId": "list_virtual_account_banks",
        "responses": {
          "200": {
            "description": "Bank catalog.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/VirtualAccountBankEntry"
                  }
                }
              }
            }
          }
        },
        "security": [
          {}
        ]
      }
    }
  },
  "components": {
    "schemas": {
      "AcceptQuoteRequest": {
        "type": "object",
        "description": "Body for `POST /v0/quotes/:id/accept`. Fields are optional unless the\nchosen route requires source funding details; callers confirm which\nquote to accept and supply execution or audit fields.",
        "properties": {
          "comment": {
            "type": [
              "string",
              "null"
            ]
          },
          "expired_quote_behavior": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "$ref": "#/components/schemas/ExpiredQuoteBehavior",
                "description": "How to handle a payment funded after the accepted quote expired:\n`refund_payment` (the default) returns the funds, while\n`flexible_destination_amount` / `flexible_source_amount` re-quote\nat the current rate and settle with that amount recalculated.\nOnly values listed on the chosen quote's\n`supported_expired_quote_behaviors` are accepted — anything else\nis rejected with a typed `expired_quote_behavior` violation."
              }
            ]
          },
          "expired_quote_tolerance_bps": {
            "type": [
              "integer",
              "null"
            ],
            "format": "int32",
            "description": "With `refund_payment`, how far a payment priced again after the\naccepted quote expired may fall short of the accepted amount and still\nbe sent, in basis points (0–500) of what the recipient receives after\nfees. Beyond it the funds are returned. Defaults to the org's\n`expired_quote_tolerance_bps`; rejected with a flexible behavior.",
            "minimum": 0
          },
          "files": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "$ref": "#/components/schemas/SupportingFile"
            },
            "description": "Compliance attachments, each an object declaring its `type`\n(invoice, purchase order, …) beside the document itself as a data\nURI (`data:<mime>;base64,<contents>`); compliance review reads each\ndocument as its declared type. An entry without a `type`, or a bare\ndata URI string, is rejected. Some corridors require one before\nacceptance: check the chosen quote's\n`acceptance_requirements.files_required`. Seismic forwards them for\ncompliance review — the recipient never sees them. PDF / JPEG /\nPNG, max 5 MB each."
          },
          "from_address": {
            "type": [
              "string",
              "null"
            ],
            "description": "Sending wallet for a blockchain-sourced payment with no attached\nsource account. Overrides the source address captured when the\nquote was created. Required when neither the quote nor an attached\naccount identifies the source, unless the payment is funded through a\ndeposit address (the order comes back `awaiting_funds` with\n`funding_instructions.crypto.deposit_address`), where it is optional. Rejected for\nfiat sources and attached source accounts."
          },
          "payment_reason": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "$ref": "#/components/schemas/PaymentReason",
                "description": "Why this payment is being made. Settlement networks require one of\nthese fixed categories — banks key compliance decisions off it.\nCurrently optional for backwards compatibility; the\n`seismic-orchestration` client already requires it, and it will\nbecome required here. Omitted → Seismic settles the payment under\na default reason."
              }
            ]
          },
          "quote_id": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid",
            "description": "Which quote in the snapshot to accept, addressed by its `id`.\nWhen omitted the service accepts the best-ranked quote."
          },
          "reference": {
            "type": [
              "string",
              "null"
            ],
            "description": "Message carried with the payment, commonly an invoice id. Echoed\nback on the resulting order. At most 128 characters, limited to\nletters, numbers, spaces, dashes, and colons — the reference\ntravels onto the beneficiary's statement, and settlement networks\nrefuse anything else."
          },
          "return_address": {
            "type": [
              "string",
              "null"
            ],
            "description": "Refund address for stablecoin-sourced payments: if the payment\nfails or expires, funds are returned to this address on the\nsource chain. Omitted → defaults to the sending wallet when one\nis known. Rejected when the source leg is fiat."
          },
          "source_account_number": {
            "type": [
              "string",
              "null"
            ],
            "description": "Bank account number the payment will be funded from. Required\nwhen the chosen quote's\n`acceptance_requirements.source_account_number_required` is true —\nthe local network needs the originating account declared before\nfunds are sent. Rejected when it is false."
          },
          "source_of_funds": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "$ref": "#/components/schemas/SourceOfFunds",
                "description": "Where the money being sent came from. Defaults to the source of\nfunds recorded on the sender's verification profile; set it here\nto declare a different one for this payment only — the profile\nis left unchanged. Settlement networks require one of these\nfixed categories, so a payment with neither is declared as\n`other`."
              }
            ]
          }
        }
      },
      "AcceptQuoteResult": {
        "allOf": [
          {
            "$ref": "#/components/schemas/ApiOrder"
          }
        ],
        "description": "Envelope returned by `POST /v0/quotes/:id/accept`. Carries the\nfull order so callers can surface `funding_instructions` and\nlifecycle state without a follow-up read."
      },
      "AccountDepositStatus": {
        "type": "string",
        "description": "Lifecycle of a deposit credited to a virtual account. Seismic\nregisters a deposit on the first event describing it, and the\nstatus advances forward-only as later events land — a deposit that\nnever completes (held in review, returned to sender) stays visible\nfor its whole life instead of being dropped.",
        "enum": [
          "pending",
          "under_review",
          "completed",
          "refunded",
          "failed"
        ]
      },
      "AccountHolderAddress": {
        "type": "object",
        "description": "Address attached to an `AccountHolderInput`. `country` is always\nrequired; some corridors additionally require `line1` (and beyond)\nat create time — `GET /v0/accounts/fiat/external/requirements`\nreturns the per-corridor list. Where the holder's country has no\nstates or regions, or no postal codes, omit that field even when the\nlist requires it.",
        "required": [
          "country"
        ],
        "properties": {
          "city": {
            "type": [
              "string",
              "null"
            ]
          },
          "country": {
            "type": "string",
            "description": "ISO-3166-1 alpha-2 country code (`US`, `GB`, …). Required."
          },
          "line1": {
            "type": [
              "string",
              "null"
            ]
          },
          "line2": {
            "type": [
              "string",
              "null"
            ]
          },
          "postal_code": {
            "type": [
              "string",
              "null"
            ]
          },
          "state": {
            "type": [
              "string",
              "null"
            ]
          }
        }
      },
      "AccountHolderInput": {
        "type": "object",
        "description": "Holder identity attached to an external account create. Third-party\ndestinations are first-class — this is the legal owner of the\ndestination, which may differ from the customer. On external fiat it\nis required; on external crypto it is optional and defaults to the\ncustomer's own KYB/KYC profile when omitted.",
        "required": [
          "type",
          "address"
        ],
        "properties": {
          "address": {
            "$ref": "#/components/schemas/AccountHolderAddress"
          },
          "business_name": {
            "type": [
              "string",
              "null"
            ],
            "description": "Required when `type=business`. Ignored for individuals."
          },
          "date_of_birth": {
            "type": [
              "string",
              "null"
            ],
            "description": "Date of birth (`YYYY-MM-DD`), individuals only. Optional: no\ncorridor currently requires it. If the requirements response for the\nselected corridor and rail ever marks `account_holder.date_of_birth`\nas required, supply it here; the create endpoint does not fill it\nfrom the customer's KYC profile. Ignored for businesses."
          },
          "email": {
            "type": [
              "string",
              "null"
            ]
          },
          "first_name": {
            "type": [
              "string",
              "null"
            ],
            "description": "Required when `type=individual`. Ignored for businesses."
          },
          "industry": {
            "type": [
              "string",
              "null"
            ],
            "description": "The six-digit NAICS code of the industry the holder business is in,\nfrom `GET /v0/industries/account-holder`; a bank account rejects any\nother code, while a wallet takes any code `GET /v0/industries` lists.\nBusiness holders only; ignored for individuals.\n\nRequired on a third-party business's USD bank account: a create\nwithout it is refused with `422`. A first-party account falls back to the\nindustry on the customer's KYB profile when omitted; without either,\nit can be registered for fewer settlement options, and one with no\nother option is created but not registered for settlement until it\nis added through\n`PATCH /v0/customers/{id}/accounts/fiat/{account_id}/holder`."
          },
          "is_third_party": {
            "type": "boolean",
            "description": "`true` when the destination account belongs to someone other\nthan the customer (vendor, employer, counterparty), `false` when\nthe customer owns it. Required on an external bank account: a\ncreate without it is refused with `400`. Optional on a wallet,\nwhere it defaults to `false`."
          },
          "last_name": {
            "type": [
              "string",
              "null"
            ]
          },
          "relationship": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "$ref": "#/components/schemas/HolderRelationship",
                "description": "Who the holder is to the customer, as one of the codes\n`GET /v0/accounts/fiat/external/requirements` publishes under\n`account_holder.relationship` — `EMPL`, `VEND`, `CUST`, `SELF` and so\non, with the set depending on `type`.\n\nRequired on a third-party USD bank account\n(`is_third_party: true`): a create without it is refused with `422`. An account the customer\nowns answers it through `is_third_party: false`. An account\nregistered without one takes it through\n`PATCH /v0/customers/{id}/accounts/fiat/{account_id}/holder`."
              }
            ]
          },
          "type": {
            "$ref": "#/components/schemas/AccountHolderKind"
          }
        }
      },
      "AccountHolderKind": {
        "type": "string",
        "enum": [
          "individual",
          "business"
        ]
      },
      "AccountLiquidationStatus": {
        "type": "string",
        "description": "Lifecycle of a liquidation draining a virtual account\n(`account_liquidations.status`) — the auto-conversion + on-chain\nsettlement of an inbound fiat deposit. Rows are written on the\nFIRST event describing the payout and advance forward-only as later\nevents land, so a payout that stalls or is refunded stays visible\nfor its whole life instead of being dropped.",
        "enum": [
          "pending",
          "processing",
          "sent",
          "completed",
          "refunded",
          "failed"
        ]
      },
      "AccountPurpose": {
        "type": "string",
        "enum": [
          "personal_use",
          "investment",
          "crypto_investment",
          "savings",
          "remittances",
          "payroll",
          "purchase_goods_and_services",
          "other",
          "charitable_donations",
          "ecommerce_collections",
          "freelance_collections",
          "salary_collections",
          "receive_payments_for_goods_and_services",
          "business_operations",
          "treasury_management"
        ]
      },
      "AddExternalFiatRailRequest": {
        "type": "object",
        "description": "Enable another rail on an existing US USD external bank account.",
        "required": [
          "rail",
          "routing_number"
        ],
        "properties": {
          "rail": {
            "$ref": "#/components/schemas/ExternalBankRail"
          },
          "routing_number": {
            "type": "string",
            "description": "Bank-confirmed routing number for the requested rail. On an account\nthat supports a separate routing number per rail, a number that\ndiffers from the account's registers that ABA for the rail being\nadded and leaves the rails already on the account on theirs; on an\naccount whose rails share one routing number, only the account's own\nis accepted. A rail that already holds a different routing number is\nnot repointed."
          }
        },
        "additionalProperties": false
      },
      "AddExternalFiatRailResponse": {
        "type": "object",
        "required": [
          "id",
          "rail",
          "account"
        ],
        "properties": {
          "account": {
            "$ref": "#/components/schemas/ApiAccount"
          },
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "rail": {
            "$ref": "#/components/schemas/ExternalBankRail"
          }
        }
      },
      "Address": {
        "allOf": [
          {
            "$ref": "#/components/schemas/AddressLines"
          },
          {
            "type": "object",
            "properties": {
              "country": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "ISO-3166-1 alpha-2 country code: two letters (`SG`, `US`, `GB`),\nnever the country name.",
                "maxLength": 2,
                "minLength": 2
              },
              "transliterated_address": {
                "oneOf": [
                  {
                    "type": "null"
                  },
                  {
                    "$ref": "#/components/schemas/AddressLines",
                    "description": "Latin-1 transliteration of the address, supplied when the\ncanonical fields contain non-Latin-1 characters."
                  }
                ]
              }
            }
          }
        ]
      },
      "AddressFieldRequirement": {
        "type": "string",
        "description": "Whether a country's national address format includes a field, and if so\nwhether an address is deliverable without it. `absent` means the country's\nformat has no such field — omit it rather than sending an empty string.",
        "enum": [
          "required",
          "optional",
          "absent"
        ]
      },
      "AddressLines": {
        "type": "object",
        "properties": {
          "city": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 128
          },
          "line1": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 256
          },
          "line2": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 256
          },
          "postal_code": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 32
          },
          "state": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 128
          }
        }
      },
      "AddressRequirementsResponse": {
        "type": "object",
        "description": "Whether an address in a given country carries a state / region and a\npostal code.",
        "required": [
          "country",
          "state",
          "postal_code"
        ],
        "properties": {
          "country": {
            "type": "string",
            "description": "Echo of the query, normalized to uppercase."
          },
          "postal_code": {
            "$ref": "#/components/schemas/AddressFieldRequirement",
            "description": "Requirement for the address `postal_code` field."
          },
          "state": {
            "$ref": "#/components/schemas/AddressFieldRequirement",
            "description": "Requirement for the address `state` field."
          }
        }
      },
      "AmountLeg": {
        "type": "string",
        "description": "Which leg a quote request's `amount` is denominated in. `Source`\nfixes what the customer pays (\"exact-in\", the default); `Destination`\nfixes what the recipient receives (\"exact-out\") and prices the\nrequired source amount.",
        "enum": [
          "source",
          "destination"
        ]
      },
      "AnsweredRfiDto": {
        "type": "object",
        "description": "One answered request, as the verification form's read-only \"RFI Log\"\nsection shows it.",
        "required": [
          "id",
          "items"
        ],
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/AnsweredRfiItemDto"
            },
            "description": "Answered items, in the order they were asked. Each carries the\nlatest answer on record."
          },
          "sent_at": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          }
        }
      },
      "AnsweredRfiItemDto": {
        "type": "object",
        "description": "One answered item: the question as asked and the latest answer, a\nwritten response and/or the document supplied.",
        "required": [
          "question",
          "answered_at"
        ],
        "properties": {
          "answer": {
            "type": [
              "string",
              "null"
            ]
          },
          "answered_at": {
            "type": "string",
            "format": "date-time"
          },
          "document_filename": {
            "type": [
              "string",
              "null"
            ],
            "description": "The supplied document's filename, kept after the document is retired."
          },
          "document_id": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid",
            "description": "The supplied document as it is on record now, openable through the\ndocuments endpoints. Absent once no copy of the document remains."
          },
          "question": {
            "type": "string"
          }
        }
      },
      "ApiAccount": {
        "type": "object",
        "description": "Materialized partner-facing account.\n\n`kind` + `shape` together determine the layout of `details`:\n`kind=fiat,shape=us` → `details` is an `ApiUsBankFiatAccount`;\n`kind=crypto,shape=evm` → `details` is an `ApiCryptoAccount`. There\nis no discriminator key inside `details` — the wire form carries the\nshape-specific keys directly inside the `details` object.\n\n`currency` is singular for both kinds. `rails` is plural — fiat\naccounts can settle over multiple rails (ACH + wire + RTP for US,\nSEPA + SWIFT for EUR, …), and crypto accounts return a one-element\narray (one wallet address lives on one chain).",
        "required": [
          "id",
          "customer_id",
          "kind",
          "shape",
          "origin",
          "currency",
          "rails",
          "status",
          "created_at",
          "updated_at"
        ],
        "properties": {
          "account_holder": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "$ref": "#/components/schemas/ApiAccountHolder",
                "description": "Who owns the account. Absent when neither a holder name nor\naddress is available, including legacy third-party accounts\nregistered before holder records were kept."
              }
            ]
          },
          "asset_contract_address": {
            "type": [
              "string",
              "null"
            ],
            "description": "Token contract pinned to a crypto account when it is created."
          },
          "asset_standard": {
            "type": [
              "string",
              "null"
            ],
            "description": "Token interface used by a crypto account, such as `erc20` or `src20`."
          },
          "available_balance": {
            "type": [
              "string",
              "null"
            ],
            "description": "Portion of `balance` spendable right now (total minus\nholds/pending). Absent when the distinction doesn't exist for\nthe account."
          },
          "balance": {
            "type": [
              "string",
              "null"
            ],
            "description": "Funds held in the account, in `currency` major units, as of\n`balance_as_of`. Seismic keeps this in sync as funds move\n(deposits, payments, account updates). Present on virtual\naccounts once the first sync lands; always absent on external\naccounts (their funds sit at the partner's own bank/wallet)."
          },
          "balance_as_of": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time",
            "description": "When Seismic last refreshed `balance`."
          },
          "can_enable_liquidation": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Whether auto-liquidation can be enabled on this account via\n`PUT /v0/accounts/{id}/liquidation`. Present only on virtual\nbank accounts that don't auto-liquidate; where `false` (or\nabsent), a liquidation target can only be attached when a\nvirtual account is created."
          },
          "chain_id": {
            "type": [
              "integer",
              "null"
            ],
            "format": "int64",
            "description": "Numeric network identifier pinned when a crypto account is created."
          },
          "created_at": {
            "type": "string",
            "format": "date-time"
          },
          "currency": {
            "type": "string"
          },
          "customer_id": {
            "type": "string",
            "format": "uuid"
          },
          "details": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "$ref": "#/components/schemas/ApiAccountDetails",
                "description": "Where to send money to reach this account. Absent while a\nvirtual account is still being provisioned, and permanently\nabsent when provisioning `failed` — no identifiers have been\nissued, so there is nothing payable to publish. Also absent\nonce the account is `closed`, which no longer accepts deposits.\nPresent on every `active` account, and always present on an\nexternal account (the caller supplied the details). The field is\nomitted entirely rather than blanked, so a client that reads it\ncan't mistake a stale identifier for a live one."
              }
            ]
          },
          "developer_fee_supported": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Whether `liquidation.developer_fee_bps` is accepted on this account,\nwhen enabling or retargeting auto-liquidation. Present only on\nvirtual bank accounts; absent while the account is still\nprovisioning."
          },
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "kind": {
            "$ref": "#/components/schemas/ApiAccountKind"
          },
          "liquidation": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "$ref": "#/components/schemas/ApiLiquidation",
                "description": "Auto-liquidation destination for a virtual fiat account: fiat\ncredited here is converted and settled to this crypto account.\nPresent only on virtual fiat accounts created with a\n`liquidation` target; absent otherwise."
              }
            ]
          },
          "liquidation_can_turn_off": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Whether auto-liquidation on this account, once on, can be turned\noff via `DELETE /v0/accounts/{id}/liquidation`. Present only on\nvirtual bank accounts; absent while the account is still\nprovisioning."
          },
          "origin": {
            "$ref": "#/components/schemas/ApiAccountOrigin"
          },
          "rails": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "shape": {
            "$ref": "#/components/schemas/ApiAccountShape"
          },
          "status": {
            "$ref": "#/components/schemas/ApiAccountStatus"
          },
          "updated_at": {
            "type": "string",
            "format": "date-time"
          }
        }
      },
      "ApiAccountBalance": {
        "type": "object",
        "description": "Funds held in a virtual account — body of\n`GET /v0/accounts/:id/balance`. Served from the locally-stored\nsnapshot Seismic keeps in sync as funds move (deposits, payments,\naccount updates); `as_of` is when that snapshot was last\nrefreshed.\n\nAmounts are decimal strings in `currency` major units, matching\nevery other amount on the API. `available_balance` is the portion\nspendable right now (total minus holds/pending credits); omitted\nwhen the distinction doesn't exist for the account.",
        "required": [
          "account_id",
          "kind",
          "currency",
          "balance",
          "as_of"
        ],
        "properties": {
          "account_id": {
            "type": "string",
            "format": "uuid"
          },
          "as_of": {
            "type": "string",
            "format": "date-time"
          },
          "available_balance": {
            "type": [
              "string",
              "null"
            ]
          },
          "balance": {
            "type": "string"
          },
          "currency": {
            "type": "string"
          },
          "kind": {
            "$ref": "#/components/schemas/ApiAccountKind"
          }
        }
      },
      "ApiAccountCreationRequest": {
        "type": "object",
        "description": "An account creation request, fiat or crypto.\n\nUnlike `ApiAccount`, `details` is *optional* here — a pending\nvirtual creation request legitimately has no details yet (Seismic\nhasn't finished provisioning the account). For `origin: \"external\"`,\n`details` is always populated (caller supplied the bank /\nwallet info).",
        "required": [
          "id",
          "customer_id",
          "kind",
          "shape",
          "origin",
          "currency",
          "rails",
          "status",
          "idempotency_key",
          "created_at",
          "updated_at"
        ],
        "properties": {
          "account_id": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid"
          },
          "created_at": {
            "type": "string",
            "format": "date-time"
          },
          "currency": {
            "type": "string"
          },
          "customer_id": {
            "type": "string",
            "format": "uuid"
          },
          "details": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "$ref": "#/components/schemas/ApiAccountDetails"
              }
            ]
          },
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "idempotency_key": {
            "type": "string"
          },
          "kind": {
            "$ref": "#/components/schemas/ApiAccountKind"
          },
          "origin": {
            "$ref": "#/components/schemas/ApiAccountOrigin"
          },
          "rails": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "shape": {
            "$ref": "#/components/schemas/ApiAccountShape"
          },
          "status": {
            "$ref": "#/components/schemas/ApiAccountRequestStatus"
          },
          "updated_at": {
            "type": "string",
            "format": "date-time"
          }
        }
      },
      "ApiAccountDeposit": {
        "type": "object",
        "description": "One deposit into a virtual account outside the order flow — the\nread-side twin of the `deposit.status_changed` webhook\nevent. `id` is the same\nidentifier those events carry in `deposit.id`, so the surfaces\nreconcile. Deposits have a lifecycle: Seismic registers each one\nwhen it is first reported and `status` advances as it settles\n(`pending` / `under_review` → `completed`, or `refunded` / `failed`\nwhen the funds bounce). `status_reason` carries the explanation\nfor the current status when one was reported — usually absent.\n`amount` / `currency` are absent when the deposit report omitted\nthem; `received_at` is when Seismic registered the deposit.",
        "required": [
          "id",
          "customer_id",
          "account_id",
          "account_kind",
          "status",
          "received_at"
        ],
        "properties": {
          "account_id": {
            "type": "string",
            "format": "uuid"
          },
          "account_kind": {
            "$ref": "#/components/schemas/ApiAccountKind"
          },
          "amount": {
            "type": [
              "string",
              "null"
            ]
          },
          "currency": {
            "type": [
              "string",
              "null"
            ]
          },
          "customer_id": {
            "type": "string",
            "format": "uuid"
          },
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "received_at": {
            "type": "string",
            "format": "date-time"
          },
          "reference": {
            "type": [
              "string",
              "null"
            ],
            "description": "Payment reference reported with the deposit — the bank statement\nline of the credit (e.g. `ACH Credit 021000024184980 ACME\nPAYMENTS LLC`). Absent when none was reported."
          },
          "source": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "$ref": "#/components/schemas/ApiDepositSource",
                "description": "Who sent the deposit, when Seismic can determine it. Absent when\nno originator details were reported."
              }
            ]
          },
          "status": {
            "$ref": "#/components/schemas/AccountDepositStatus"
          },
          "status_reason": {
            "type": [
              "string",
              "null"
            ]
          },
          "transaction_hash": {
            "type": [
              "string",
              "null"
            ],
            "description": "On-chain settlement hash, present only for crypto-rail deposits."
          }
        }
      },
      "ApiAccountDetails": {
        "oneOf": [
          {
            "$ref": "#/components/schemas/ApiFiatAccount"
          },
          {
            "$ref": "#/components/schemas/ApiCryptoAccount"
          }
        ],
        "description": "Shape-specific detail block on `ApiAccount` /\n`ApiAccountCreationRequest`. There is no discriminator key — the\nvariant is identified by its field set. `kind` on the parent gives\ncallers an explicit fiat-vs-crypto discriminator without needing to\ninspect the body."
      },
      "ApiAccountHolder": {
        "type": "object",
        "description": "Owner of an account — the legal entity funds are sent to. On an\nexternal account that is whoever was named at create time, which may\nbe a third party; on a virtual account it is always the customer.",
        "required": [
          "address"
        ],
        "properties": {
          "address": {
            "$ref": "#/components/schemas/Address",
            "description": "Where the account holder is located. Distinct from the\n`bank_address` in `details`, which locates the bank. A crypto\ncreate only has to supply the holder's `country`, so this can\ncarry nothing else — `name` identifies the holder in that case."
          },
          "industry": {
            "type": [
              "string",
              "null"
            ],
            "description": "The holder business's NAICS industry code, as the create request\ncarried it. Absent when none was sent, and on crypto accounts."
          },
          "is_third_party": {
            "type": "boolean",
            "description": "`true` when the account belongs to someone other than the\ncustomer (vendor, employer, counterparty). Always `false` on\nvirtual accounts."
          },
          "name": {
            "type": [
              "string",
              "null"
            ],
            "description": "The registered account holder's name. Virtual accounts use the\nrecorded bank holder name when available, otherwise the customer's\nprofile name. A missing first-party crypto holder name also falls\nback to that customer's profile; third-party names are never inferred."
          },
          "relationship": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "$ref": "#/components/schemas/HolderRelationship",
                "description": "Who the holder is to the customer, as the code the create request\ncarried — see `account_holder.relationship` on the external-fiat\nrequirements recipe. Absent when none was sent, and on crypto\naccounts, whose create request is not replayable."
              }
            ]
          },
          "type": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "$ref": "#/components/schemas/AccountHolderKind",
                "description": "Whether the holder is a person or a business, as the create request\nnamed it. External bank accounts only."
              }
            ]
          }
        }
      },
      "ApiAccountKind": {
        "type": "string",
        "description": "Top-level kind of the account — fiat vs crypto. Carried explicitly\non `ApiAccount` and `ApiAccountCreationRequest` so callers can\nbranch without parsing `shape` (and because `details` is an\nuntagged enum that won't help them dispatch).",
        "enum": [
          "fiat",
          "crypto"
        ]
      },
      "ApiAccountLiquidation": {
        "type": "object",
        "description": "One auto-liquidation of a virtual-account deposit — the read-side\ntwin of the `account.deposit_liquidated` webhook event. `id` is the\nsame identifier the event carries in `liquidation.id`, so the\nsurfaces reconcile. Seismic registers each liquidation when it is\nfirst reported and `status` advances as it settles (`pending` /\n`processing` → `completed`, or `refunded` / `failed` when the payout\nbounces). `deposit_id` links back to the funding deposit on\n`GET /deposits` when Seismic can resolve it. Amount fields are\nabsent when the report omitted them; `created_at` is when Seismic\nregistered the liquidation.",
        "required": [
          "id",
          "customer_id",
          "status",
          "created_at"
        ],
        "properties": {
          "account_id": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid",
            "description": "The virtual account the liquidation drained. Absent when the\nreport named no account Seismic holds."
          },
          "created_at": {
            "type": "string",
            "format": "date-time"
          },
          "customer_id": {
            "type": "string",
            "format": "uuid"
          },
          "deposit_id": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid"
          },
          "destination_address": {
            "type": [
              "string",
              "null"
            ]
          },
          "destination_chain": {
            "type": [
              "string",
              "null"
            ]
          },
          "exchange_rate": {
            "type": [
              "string",
              "null"
            ]
          },
          "fee": {
            "type": [
              "string",
              "null"
            ]
          },
          "from_amount": {
            "type": [
              "string",
              "null"
            ]
          },
          "from_currency": {
            "type": [
              "string",
              "null"
            ]
          },
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "status": {
            "$ref": "#/components/schemas/AccountLiquidationStatus"
          },
          "status_reason": {
            "type": [
              "string",
              "null"
            ]
          },
          "to_amount": {
            "type": [
              "string",
              "null"
            ]
          },
          "to_currency": {
            "type": [
              "string",
              "null"
            ]
          },
          "transaction_hash": {
            "type": [
              "string",
              "null"
            ],
            "description": "On-chain settlement hash of the crypto leg."
          }
        }
      },
      "ApiAccountOrigin": {
        "type": "string",
        "enum": [
          "external",
          "virtual"
        ]
      },
      "ApiAccountRequestStatus": {
        "type": "string",
        "enum": [
          "pending",
          "completed",
          "failed"
        ]
      },
      "ApiAccountShape": {
        "oneOf": [
          {
            "$ref": "#/components/schemas/FiatShape"
          },
          {
            "$ref": "#/components/schemas/CryptoShape"
          }
        ],
        "description": "The shape of an account — fiat-side or crypto-side. Wire form is a\nflat string (`\"us\"`, `\"uk\"`, `\"iban\"`, `\"evm\"`, `\"sol\"`, …) — serde\nuntagged picks the inner enum whose variant set contains the\nincoming token. Disjoint variant sets between `FiatShape` and\n`CryptoShape` make the disambiguation unambiguous."
      },
      "ApiAccountStatus": {
        "type": "string",
        "description": "Lifecycle a partner-visible account can be in. `pending` and\n`failed` occur only for crypto accounts whose setup is still running\nor failed; every other account is `active` until closed. `paused` is a reversible hold on a fiat\naccount whose holder's verification is paused: it clears on unpause.",
        "enum": [
          "pending",
          "active",
          "failed",
          "closed",
          "paused"
        ]
      },
      "ApiArCbuFiatAccount": {
        "type": "object",
        "required": [
          "cbu",
          "tax_number",
          "phone",
          "bank_name",
          "account_holder_name",
          "bank_address"
        ],
        "properties": {
          "account_holder_name": {
            "type": "string"
          },
          "alias": {
            "type": [
              "string",
              "null"
            ]
          },
          "bank_address": {
            "$ref": "#/components/schemas/Address"
          },
          "bank_name": {
            "type": "string"
          },
          "cbu": {
            "type": "string"
          },
          "id_number": {
            "type": [
              "string",
              "null"
            ]
          },
          "id_type": {
            "type": [
              "string",
              "null"
            ]
          },
          "phone": {
            "type": "string"
          },
          "registration_number": {
            "type": [
              "string",
              "null"
            ]
          },
          "registration_type": {
            "type": [
              "string",
              "null"
            ]
          },
          "tax_number": {
            "type": "string"
          }
        }
      },
      "ApiAuBsbFiatAccount": {
        "type": "object",
        "required": [
          "bsb",
          "account_number",
          "account_holder_name",
          "bank_address"
        ],
        "properties": {
          "account_holder_name": {
            "type": "string"
          },
          "account_number": {
            "type": "string"
          },
          "bank_address": {
            "$ref": "#/components/schemas/Address"
          },
          "bsb": {
            "type": "string",
            "description": "BSB (\"Bank-State-Branch\", 6 digits) — names the bank and the\nbranch together."
          }
        }
      },
      "ApiBankParty": {
        "type": "object",
        "description": "A bank named on an account's payment instructions: who to address, and\nwhere they are.",
        "properties": {
          "address": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "$ref": "#/components/schemas/Address",
                "description": "Published as free-text lines, so only `line1` and `line2` are\npopulated — there is no separate city, state or postal field to\nread, and the platform does not guess one."
              }
            ]
          },
          "name": {
            "type": [
              "string",
              "null"
            ]
          }
        }
      },
      "ApiBrBankFiatAccount": {
        "type": "object",
        "required": [
          "bank_code",
          "agency",
          "account_number",
          "account_subtype",
          "account_holder_name",
          "bank_address"
        ],
        "properties": {
          "account_holder_name": {
            "type": "string"
          },
          "account_number": {
            "type": "string"
          },
          "account_subtype": {
            "$ref": "#/components/schemas/BrAccountSubtype"
          },
          "agency": {
            "type": "string"
          },
          "bank_address": {
            "$ref": "#/components/schemas/Address"
          },
          "bank_code": {
            "type": "string"
          },
          "bank_name": {
            "type": [
              "string",
              "null"
            ]
          },
          "id_number": {
            "type": [
              "string",
              "null"
            ]
          },
          "id_type": {
            "type": [
              "string",
              "null"
            ]
          },
          "phone": {
            "type": [
              "string",
              "null"
            ]
          },
          "registration_number": {
            "type": [
              "string",
              "null"
            ]
          },
          "registration_type": {
            "type": [
              "string",
              "null"
            ]
          },
          "tax_number": {
            "type": [
              "string",
              "null"
            ]
          }
        }
      },
      "ApiBrPixFiatAccount": {
        "type": "object",
        "required": [
          "pix_key",
          "pix_key_type",
          "account_holder_name",
          "bank_address"
        ],
        "properties": {
          "account_holder_name": {
            "type": "string"
          },
          "bank_address": {
            "$ref": "#/components/schemas/Address"
          },
          "pix_key": {
            "type": "string"
          },
          "pix_key_type": {
            "$ref": "#/components/schemas/PixKeyKind"
          }
        }
      },
      "ApiCaEftFiatAccount": {
        "type": "object",
        "required": [
          "institution_number",
          "transit_number",
          "account_number",
          "bank_name",
          "account_holder_name",
          "bank_address"
        ],
        "properties": {
          "account_holder_name": {
            "type": "string"
          },
          "account_number": {
            "type": "string"
          },
          "bank_address": {
            "$ref": "#/components/schemas/Address"
          },
          "bank_name": {
            "type": "string"
          },
          "institution_number": {
            "type": "string"
          },
          "transit_number": {
            "type": "string"
          }
        }
      },
      "ApiCnyFiatAccount": {
        "type": "object",
        "required": [
          "account_number",
          "cnaps_code",
          "id_number",
          "account_holder_name",
          "bank_address"
        ],
        "properties": {
          "account_holder_name": {
            "type": "string"
          },
          "account_number": {
            "type": "string"
          },
          "bank_address": {
            "$ref": "#/components/schemas/Address"
          },
          "bank_name": {
            "type": [
              "string",
              "null"
            ]
          },
          "branch_name": {
            "type": [
              "string",
              "null"
            ]
          },
          "cnaps_code": {
            "type": "string"
          },
          "id_number": {
            "type": "string"
          },
          "id_type": {
            "type": [
              "string",
              "null"
            ]
          },
          "registration_number": {
            "type": [
              "string",
              "null"
            ]
          },
          "registration_type": {
            "type": [
              "string",
              "null"
            ]
          }
        }
      },
      "ApiCoBankFiatAccount": {
        "type": "object",
        "required": [
          "bank_code",
          "account_number",
          "account_type",
          "id_type",
          "id_number",
          "account_holder_name",
          "bank_address"
        ],
        "properties": {
          "account_holder_name": {
            "type": "string"
          },
          "account_number": {
            "type": "string"
          },
          "account_type": {
            "$ref": "#/components/schemas/CoBankAccountType"
          },
          "bank_address": {
            "$ref": "#/components/schemas/Address"
          },
          "bank_code": {
            "type": "string",
            "description": "Bank code as published by the Colombian banking association."
          },
          "id_number": {
            "type": "string"
          },
          "id_type": {
            "$ref": "#/components/schemas/CoIdType"
          }
        }
      },
      "ApiCryptoAccount": {
        "type": "object",
        "description": "Wire view of a crypto account's per-shape details.\n\n`address` is optional because a crypto account still being set up\nhas no on-chain address yet. It is omitted from the wire response\nuntil the address is assigned.",
        "properties": {
          "address": {
            "type": [
              "string",
              "null"
            ]
          }
        }
      },
      "ApiDepositSource": {
        "type": "object",
        "description": "Who sent the deposit, shared verbatim between the\n`deposit.status_changed` webhook event and `GET /deposits`. A bank\ndeposit identifies the sender's bank account; a blockchain deposit\nidentifies the sending wallet and the chain it settled on. Every\nfield is optional and omitted when absent — which ones arrive depends\non the rail and on how much the sending network reports.",
        "properties": {
          "account_number": {
            "type": [
              "string",
              "null"
            ],
            "description": "The sender's account number, as reported. Bank deposits only."
          },
          "bank_routing_number": {
            "type": [
              "string",
              "null"
            ],
            "description": "Routing number of the sender's bank. Bank deposits only."
          },
          "chain": {
            "type": [
              "string",
              "null"
            ],
            "description": "Chain the transfer settled on (`BASE`, `ETHEREUM`, …). Blockchain\ndeposits only; pairs with `from_address`."
          },
          "from_address": {
            "type": [
              "string",
              "null"
            ],
            "description": "The wallet the funds were sent from. Blockchain deposits only."
          },
          "rail": {
            "type": [
              "string",
              "null"
            ],
            "description": "How the deposit travelled: the chain for a blockchain deposit\n(matching `chain`), or the payment scheme for a bank deposit\n(`ach`, `wire`, `swift`, `sepa`, …). Always one of the rail names\n`GET /v0/rails` publishes, spelled exactly as that endpoint\nspells it — a scheme with no such rail is omitted rather than\nnamed in a settlement network's own vocabulary. Present when the\nsending network reported a rail, or when the credited account\naccepts exactly one and so names it by itself.\n\nOmitted — never guessed — when no rail is known: when no external\nnetwork carried the funds (a book transfer within the settlement\nnetwork), and on a credit into a virtual USD account that\nreceives ACH, wire and SWIFT on one account number and arrives\nwithout a reported scheme."
          },
          "sender_name": {
            "type": [
              "string",
              "null"
            ],
            "description": "Name of the sending party, on bank and blockchain deposits alike."
          }
        }
      },
      "ApiFiatAccount": {
        "oneOf": [
          {
            "$ref": "#/components/schemas/ApiJpZenginFiatAccount"
          },
          {
            "$ref": "#/components/schemas/ApiUsBankFiatAccount"
          },
          {
            "$ref": "#/components/schemas/ApiUkFiatAccount"
          },
          {
            "$ref": "#/components/schemas/ApiIbanFiatAccount"
          },
          {
            "$ref": "#/components/schemas/ApiSwiftFiatAccount"
          },
          {
            "$ref": "#/components/schemas/ApiCnyFiatAccount"
          },
          {
            "$ref": "#/components/schemas/ApiBrPixFiatAccount"
          },
          {
            "$ref": "#/components/schemas/ApiBrBankFiatAccount"
          },
          {
            "$ref": "#/components/schemas/ApiMxClabeFiatAccount"
          },
          {
            "$ref": "#/components/schemas/ApiInIfscFiatAccount"
          },
          {
            "$ref": "#/components/schemas/ApiArCbuFiatAccount"
          },
          {
            "$ref": "#/components/schemas/ApiHkdFiatAccount"
          },
          {
            "$ref": "#/components/schemas/ApiSgdFiatAccount"
          },
          {
            "$ref": "#/components/schemas/ApiPhBankFiatAccount"
          },
          {
            "$ref": "#/components/schemas/ApiPkIbanFiatAccount",
            "description": "PKR — the `iban` field makes this structurally distinct from\nevery other variant."
          },
          {
            "$ref": "#/components/schemas/ApiNgBankFiatAccount",
            "description": "NGN — kept AFTER the account-number variants so untagged\ndeserialization stays deterministic. Serialization is by-variant;\nuse the parent's `shape` field, never structural detection."
          },
          {
            "$ref": "#/components/schemas/ApiThbBankFiatAccount",
            "description": "THB — field-identical to `PhBank`; kept AFTER it so untagged\ndeserialization stays deterministic. Serialization is by-variant;\nuse the parent's `shape` field, never structural detection."
          },
          {
            "$ref": "#/components/schemas/ApiIdrBankFiatAccount",
            "description": "IDR — field-identical to `ThbBank`; same ordering caveat."
          },
          {
            "$ref": "#/components/schemas/ApiCaEftFiatAccount",
            "description": "CAD — the institution/transit pair makes this structurally\ndistinct from every other variant."
          },
          {
            "$ref": "#/components/schemas/ApiAuBsbFiatAccount",
            "description": "AUD — kept AFTER the account-number variants so untagged\ndeserialization stays deterministic. Serialization is by-variant;\nuse the parent's `shape` field, never structural detection."
          },
          {
            "$ref": "#/components/schemas/ApiCoBankFiatAccount",
            "description": "COP — kept AFTER the account-number variants so untagged\ndeserialization stays deterministic. Serialization is by-variant;\nuse the parent's `shape` field, never structural detection."
          }
        ],
        "description": "Per-shape fiat-side response payload. Mirrors the request-side\n`CreateFiatDetails`. There is no discriminator key: each variant's\nfield set identifies it on the wire.\n\nNew fields may be added to these payloads over time — deserialize\ntolerantly rather than rejecting unknown keys."
      },
      "ApiFundingInstructions": {
        "oneOf": [
          {
            "$ref": "#/components/schemas/FundingInstructions"
          },
          {
            "type": "object",
            "description": "The details as received; keys vary by rail and by order. Retired\nonce every reader has moved to `v2`."
          }
        ],
        "description": "`funding_instructions` on the wire: the stored object by default, the\n[`FundingInstructions`] shape when the read asks for `v2`."
      },
      "ApiHkdFiatAccount": {
        "type": "object",
        "required": [
          "account_number",
          "account_holder_name",
          "bank_address"
        ],
        "properties": {
          "account_holder_name": {
            "type": "string"
          },
          "account_number": {
            "type": "string"
          },
          "bank_address": {
            "$ref": "#/components/schemas/Address"
          },
          "bank_name": {
            "type": [
              "string",
              "null"
            ],
            "description": "Bank display name; absent when the account was registered\nwithout one."
          },
          "bic": {
            "type": [
              "string",
              "null"
            ],
            "description": "ISO 9362 BIC / SWIFT code of the destination bank."
          },
          "date_of_incorporation": {
            "type": [
              "string",
              "null"
            ]
          },
          "registration_number": {
            "type": [
              "string",
              "null"
            ]
          },
          "registration_type": {
            "type": [
              "string",
              "null"
            ]
          }
        }
      },
      "ApiIbanFiatAccount": {
        "type": "object",
        "required": [
          "account_number",
          "account_holder_name",
          "bank_address"
        ],
        "properties": {
          "account_holder_name": {
            "type": "string"
          },
          "account_number": {
            "type": "string"
          },
          "bank_address": {
            "$ref": "#/components/schemas/Address"
          },
          "bank_code": {
            "type": [
              "string",
              "null"
            ]
          },
          "bank_name": {
            "type": [
              "string",
              "null"
            ]
          },
          "bic": {
            "type": [
              "string",
              "null"
            ]
          },
          "id_number": {
            "type": [
              "string",
              "null"
            ]
          },
          "id_type": {
            "type": [
              "string",
              "null"
            ]
          },
          "phone": {
            "type": [
              "string",
              "null"
            ]
          },
          "registration_number": {
            "type": [
              "string",
              "null"
            ]
          },
          "registration_type": {
            "type": [
              "string",
              "null"
            ]
          }
        }
      },
      "ApiIdrBankFiatAccount": {
        "type": "object",
        "required": [
          "account_number",
          "bank_name",
          "account_holder_name",
          "bank_address"
        ],
        "properties": {
          "account_holder_name": {
            "type": "string"
          },
          "account_number": {
            "type": "string"
          },
          "bank_address": {
            "$ref": "#/components/schemas/Address"
          },
          "bank_name": {
            "type": "string"
          }
        }
      },
      "ApiInIfscFiatAccount": {
        "type": "object",
        "required": [
          "ifsc",
          "account_number",
          "account_holder_name",
          "bank_address"
        ],
        "properties": {
          "account_holder_name": {
            "type": "string"
          },
          "account_number": {
            "type": "string"
          },
          "bank_address": {
            "$ref": "#/components/schemas/Address"
          },
          "bank_name": {
            "type": [
              "string",
              "null"
            ]
          },
          "id_number": {
            "type": [
              "string",
              "null"
            ]
          },
          "id_type": {
            "type": [
              "string",
              "null"
            ]
          },
          "ifsc": {
            "type": "string"
          },
          "phone": {
            "type": [
              "string",
              "null"
            ]
          },
          "registration_number": {
            "type": [
              "string",
              "null"
            ]
          },
          "registration_type": {
            "type": [
              "string",
              "null"
            ]
          },
          "relationship_to_debtor": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "$ref": "#/components/schemas/HolderRelationship"
              }
            ]
          }
        }
      },
      "ApiIntermediaryBank": {
        "type": "object",
        "description": "The correspondent (intermediary) bank a cross-border payout is routed\nthrough. Every identifier belongs to the correspondent, never to the\ndestination bank the enclosing block describes.",
        "properties": {
          "account_number": {
            "type": [
              "string",
              "null"
            ],
            "description": "The destination bank's account at the correspondent, credited by\na cover payment on the way through."
          },
          "bic": {
            "type": [
              "string",
              "null"
            ],
            "description": "The correspondent's own BIC, quoted where it is outside the US\nand so has no ABA."
          },
          "country": {
            "type": [
              "string",
              "null"
            ],
            "description": "ISO-3166-1 alpha-2 country of the correspondent."
          },
          "name": {
            "type": [
              "string",
              "null"
            ]
          },
          "routing_number": {
            "type": [
              "string",
              "null"
            ]
          }
        }
      },
      "ApiJpZenginFiatAccount": {
        "type": "object",
        "required": [
          "bank_code",
          "branch_code",
          "account_number",
          "bank_name",
          "phone",
          "account_holder_name",
          "bank_address"
        ],
        "properties": {
          "account_holder_name": {
            "type": "string"
          },
          "account_number": {
            "type": "string"
          },
          "bank_address": {
            "$ref": "#/components/schemas/Address"
          },
          "bank_code": {
            "type": "string"
          },
          "bank_name": {
            "type": "string"
          },
          "branch_code": {
            "type": "string"
          },
          "phone": {
            "type": "string"
          }
        }
      },
      "ApiLiquidation": {
        "type": "object",
        "description": "Auto-liquidation destination surfaced on an `ApiAccount`. Names\nthe crypto account incoming fiat is auto-converted and settled to.",
        "required": [
          "account_id",
          "address",
          "currency"
        ],
        "properties": {
          "account_id": {
            "type": "string",
            "format": "uuid",
            "description": "The crypto account this account's incoming fiat is auto-converted\nand settled to."
          },
          "address": {
            "type": "string"
          },
          "can_turn_off": {
            "type": "boolean",
            "description": "Whether auto-liquidation on this account can be turned off via\n`DELETE /v0/accounts/{id}/liquidation`. Where `false`, the\nconfiguration set at creation stays in place."
          },
          "currency": {
            "type": "string"
          },
          "developer_fee_bps": {
            "type": [
              "integer",
              "null"
            ],
            "format": "int32",
            "description": "The developer fee in basis points (100 = 1%) Seismic applies to\nfunds auto-converted through this account, as set on creation or\nvia `PUT /v0/accounts/{id}/liquidation`. Absent when no fee is\nconfigured.",
            "minimum": 0
          }
        }
      },
      "ApiMxClabeFiatAccount": {
        "type": "object",
        "required": [
          "clabe",
          "account_holder_name",
          "bank_address"
        ],
        "properties": {
          "account_holder_name": {
            "type": "string"
          },
          "bank_address": {
            "$ref": "#/components/schemas/Address"
          },
          "bank_name": {
            "type": [
              "string",
              "null"
            ]
          },
          "clabe": {
            "type": "string"
          },
          "tax_number": {
            "type": [
              "string",
              "null"
            ]
          }
        }
      },
      "ApiNgBankFiatAccount": {
        "type": "object",
        "required": [
          "account_number",
          "bank_code",
          "account_holder_name",
          "bank_address"
        ],
        "properties": {
          "account_holder_name": {
            "type": "string"
          },
          "account_number": {
            "type": "string"
          },
          "bank_address": {
            "$ref": "#/components/schemas/Address"
          },
          "bank_code": {
            "type": "string"
          },
          "bank_name": {
            "type": [
              "string",
              "null"
            ]
          }
        }
      },
      "ApiOrder": {
        "type": "object",
        "description": "An accepted order: the resolved economic legs, lifecycle status,\nand funding instructions when the chosen rail requires pre-funding.\nReturned inline from `POST /v0/quotes/:id/accept`.",
        "required": [
          "id",
          "status",
          "source",
          "destination",
          "idempotency_key",
          "created_at"
        ],
        "properties": {
          "comment": {
            "type": [
              "string",
              "null"
            ]
          },
          "created_at": {
            "type": "string",
            "format": "date-time"
          },
          "destination": {
            "$ref": "#/components/schemas/ApiOrderLeg"
          },
          "fees": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "$ref": "#/components/schemas/QuoteFees",
                "description": "The fees itemized on the quote this payment was accepted at, in the\nsource currency, including your developer fee. Omitted for payments\nwith no accepted quote on record."
              }
            ]
          },
          "funding_instructions": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "$ref": "#/components/schemas/ApiFundingInstructions",
                "description": "Where and how to send the payer's money, for an order that waits\nfor it. Read with `?funding_instructions=v2` for the\n`FundingInstructions` shape, the same for every rail and order;\nwithout it, the details as received, whose keys vary (retired once\nevery reader has moved). Omitted when the order is funded otherwise\n(an attached account, a balance) or before the details are\navailable (watch for the webhook)."
              }
            ]
          },
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "idempotency_key": {
            "type": "string"
          },
          "payment_reason": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "$ref": "#/components/schemas/PaymentReason",
                "description": "Why the payment was made — the reason supplied at accept, replayed\nto the settlement network. Omitted when the caller didn't supply\none (or for orders predating the field)."
              }
            ]
          },
          "reference": {
            "type": [
              "string",
              "null"
            ]
          },
          "source": {
            "$ref": "#/components/schemas/ApiOrderLeg"
          },
          "status": {
            "$ref": "#/components/schemas/OrderStatus"
          },
          "status_reason": {
            "type": [
              "string",
              "null"
            ],
            "description": "Why the payment is in its current `status`. A payment that ended in\na terminal failure — a refunded or failed order — carries the\nsettlement network's reason code (e.g. `COMPLIANCE_BLOCKED`,\n`INVALID_EXTERNAL_ACCOUNT_DETAILS`). A `processing` order held for a\nsupporting document reads `documents_required` or\n`documents_rejected` (submit one with\n`POST /customers/orders/{id}/documents`), then\n`documents_under_review`, then `documents_approved` once it\ncontinues. Omitted for healthy orders and when no reason was\nreported."
          },
          "transaction_hash": {
            "type": [
              "string",
              "null"
            ],
            "description": "On-chain settlement hash for the order's crypto leg, present once\nthe order settles over a blockchain rail and Seismic has observed\nthe settlement. Absent for fiat-only orders."
          },
          "uetr": {
            "type": [
              "string",
              "null"
            ],
            "description": "SWIFT Unique End-to-end Transaction Reference (UETR) of the order's\nfiat leg, present once the settlement network reports it for a wire\npayout. Give it to the beneficiary's bank to trace the payment.\nAbsent for other rails and until the network reports it."
          }
        }
      },
      "ApiOrderLeg": {
        "type": "object",
        "description": "One resolved leg of an accepted order, used for both `source` and\n`destination`.",
        "required": [
          "amount",
          "currency",
          "rail"
        ],
        "properties": {
          "account_id": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid",
            "description": "The registered account on this leg. Always present on the\ndestination leg, since a destination is always a registered\naccount. On the source leg, present when the quote's source was an\nattached account and absent when it was an inline descriptor (the\npayment is funded via `funding_instructions` or an external wallet)."
          },
          "amount": {
            "type": "string"
          },
          "chain": {
            "type": [
              "string",
              "null"
            ],
            "description": "Chain the source funds arrived on, reported alongside\n`from_address`."
          },
          "currency": {
            "type": "string"
          },
          "from_address": {
            "type": [
              "string",
              "null"
            ],
            "description": "Sending wallet address, present on the source leg of a payment\nfunded from an external crypto wallet once Seismic has observed\nthe settlement. Absent on fiat legs and destination legs."
          },
          "rail": {
            "type": "string"
          }
        }
      },
      "ApiOrderListItem": {
        "allOf": [
          {
            "$ref": "#/components/schemas/ApiOrder"
          },
          {
            "type": "object",
            "required": [
              "customer_id",
              "placed_by_user_id",
              "updated_at"
            ],
            "properties": {
              "customer_id": {
                "type": "string",
                "format": "uuid",
                "description": "Customer the order belongs to."
              },
              "placed_by_user_id": {
                "type": "string",
                "format": "uuid",
                "description": "Org member who placed the order (or who minted the API key it\nwas placed under). Audit attribution."
              },
              "updated_at": {
                "type": "string",
                "format": "date-time"
              }
            }
          }
        ],
        "description": "One row of `GET /v0/customers/orders` / `GET /v0/customers/:id/orders`.\nThe order exactly as the single-order read renders it, plus the list\ncontext: which customer it belongs to and who placed it."
      },
      "ApiOrderPage": {
        "type": "object",
        "description": "Cursor-paginated page of orders. `next_cursor` is `null` on the\nlast page; pass it back as `?cursor=` to fetch the next page.",
        "required": [
          "data"
        ],
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ApiOrderListItem"
            }
          },
          "next_cursor": {
            "type": [
              "string",
              "null"
            ]
          }
        }
      },
      "ApiPhBankFiatAccount": {
        "type": "object",
        "required": [
          "account_number",
          "bank_name",
          "account_holder_name",
          "bank_address"
        ],
        "properties": {
          "account_holder_name": {
            "type": "string"
          },
          "account_number": {
            "type": "string"
          },
          "bank_address": {
            "$ref": "#/components/schemas/Address"
          },
          "bank_name": {
            "type": "string"
          },
          "date_of_incorporation": {
            "type": [
              "string",
              "null"
            ]
          },
          "phone": {
            "type": [
              "string",
              "null"
            ]
          },
          "registration_number": {
            "type": [
              "string",
              "null"
            ]
          },
          "registration_type": {
            "type": [
              "string",
              "null"
            ]
          },
          "relationship_to_debtor": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "$ref": "#/components/schemas/HolderRelationship"
              }
            ]
          }
        }
      },
      "ApiPkIbanFiatAccount": {
        "type": "object",
        "required": [
          "iban",
          "account_holder_name",
          "bank_address"
        ],
        "properties": {
          "account_holder_name": {
            "type": "string"
          },
          "bank_address": {
            "$ref": "#/components/schemas/Address"
          },
          "bank_name": {
            "type": [
              "string",
              "null"
            ]
          },
          "iban": {
            "type": "string"
          }
        }
      },
      "ApiQuote": {
        "allOf": [
          {
            "$ref": "#/components/schemas/Quote"
          },
          {
            "type": "object",
            "required": [
              "is_named",
              "acceptance_requirements"
            ],
            "properties": {
              "acceptance_requirements": {
                "$ref": "#/components/schemas/QuoteAcceptanceRequirements"
              },
              "is_named": {
                "type": "boolean",
                "description": "Whether this is a named payout: the payment reaches the beneficiary\nunder the end customer's own legal name rather than an\nintermediary's. Pass `?named=1` when creating the quote to receive\nonly named options."
              }
            }
          }
        ],
        "description": "A priced quote with the known requirements for accepting it."
      },
      "ApiSgdFiatAccount": {
        "type": "object",
        "required": [
          "account_number",
          "bank_name",
          "phone",
          "account_holder_name",
          "bank_address"
        ],
        "properties": {
          "account_holder_name": {
            "type": "string"
          },
          "account_number": {
            "type": "string"
          },
          "bank_address": {
            "$ref": "#/components/schemas/Address"
          },
          "bank_name": {
            "type": "string"
          },
          "id_number": {
            "type": [
              "string",
              "null"
            ]
          },
          "id_type": {
            "type": [
              "string",
              "null"
            ]
          },
          "phone": {
            "type": "string"
          },
          "registration_number": {
            "type": [
              "string",
              "null"
            ]
          },
          "registration_type": {
            "type": [
              "string",
              "null"
            ]
          },
          "relationship_to_debtor": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "$ref": "#/components/schemas/HolderRelationship"
              }
            ]
          }
        }
      },
      "ApiSwiftFiatAccount": {
        "type": "object",
        "required": [
          "bic",
          "account_number",
          "bank_name",
          "account_holder_name",
          "bank_address"
        ],
        "properties": {
          "account_holder_name": {
            "type": "string"
          },
          "account_number": {
            "type": "string"
          },
          "bank_address": {
            "$ref": "#/components/schemas/Address"
          },
          "bank_name": {
            "type": "string"
          },
          "bic": {
            "type": "string"
          },
          "intermediary_bank": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "$ref": "#/components/schemas/ApiIntermediaryBank",
                "description": "The correspondent bank this destination is reached through.\nAbsent when the registration named none."
              }
            ]
          },
          "phone": {
            "type": [
              "string",
              "null"
            ]
          },
          "routing_number": {
            "type": [
              "string",
              "null"
            ],
            "description": "ABA routing number of the recipient bank's US correspondent\n(intermediary) bank. The same nine digits as\n`intermediary_bank.routing_number`, reported under both names."
          },
          "tax_number": {
            "type": [
              "string",
              "null"
            ]
          }
        }
      },
      "ApiThbBankFiatAccount": {
        "type": "object",
        "required": [
          "account_number",
          "bank_name",
          "account_holder_name",
          "bank_address"
        ],
        "properties": {
          "account_holder_name": {
            "type": "string"
          },
          "account_number": {
            "type": "string"
          },
          "bank_address": {
            "$ref": "#/components/schemas/Address"
          },
          "bank_name": {
            "type": "string"
          }
        }
      },
      "ApiUkFiatAccount": {
        "type": "object",
        "required": [
          "sort_code",
          "account_number",
          "account_holder_name",
          "bank_address"
        ],
        "properties": {
          "account_holder_name": {
            "type": "string"
          },
          "account_number": {
            "type": "string"
          },
          "bank_address": {
            "$ref": "#/components/schemas/Address"
          },
          "bank_name": {
            "type": [
              "string",
              "null"
            ]
          },
          "iban": {
            "type": [
              "string",
              "null"
            ]
          },
          "sort_code": {
            "type": "string"
          }
        }
      },
      "ApiUsBankFiatAccount": {
        "type": "object",
        "required": [
          "account_number",
          "routing_number",
          "account_holder_name",
          "bank_address"
        ],
        "properties": {
          "account_holder_name": {
            "type": "string"
          },
          "account_number": {
            "type": "string"
          },
          "account_type": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "$ref": "#/components/schemas/UsDepositAccountType",
                "description": "How this account is labeled on the payment instructions published\nfor it: the deposit product, paired with whether the holder is a\nperson or a company. Reported, not chosen — distinct from the\n`account_type` supplied when registering an external account,\nwhich names the product alone. Absent on an account registered\nfrom supplied details."
              }
            ]
          },
          "ach_routing_number": {
            "type": [
              "string",
              "null"
            ],
            "description": "ABA routing number to quote for an ACH credit. Absent when the\naccount does not settle over ACH."
          },
          "bank_address": {
            "$ref": "#/components/schemas/Address"
          },
          "bank_name": {
            "type": [
              "string",
              "null"
            ]
          },
          "beneficiary_address": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "$ref": "#/components/schemas/Address",
                "description": "Mailing address to quote for the beneficiary — the account holder\nnamed in `account_holder_name`. One address per account, published\nby the issuing bank and quoted the same on every rail the account\nis reachable over, domestic and international alike. Absent when\nthe issuing bank publishes no address for them, which is the case\nfor every account registered from supplied details."
              }
            ]
          },
          "bic": {
            "type": [
              "string",
              "null"
            ],
            "description": "BIC to quote for an inbound international wire, alongside\n`swift_account_number`. Absent when the account is reachable\ndomestically only."
          },
          "fedwire_routing_number": {
            "type": [
              "string",
              "null"
            ],
            "description": "ABA routing number to quote for a Fedwire credit. A bank that\npublishes a separate wire ABA reports it here; otherwise an\naccount that settles over wire routes it off the same nine digits\nas `ach_routing_number` and reports those. Absent on an account\nthat does not settle over wire."
          },
          "routing_number": {
            "type": "string",
            "description": "The account's ABA routing number: the one quoted for an ACH\ncredit when the account has one, otherwise the one quoted for a\nFedwire credit. Always present, whatever the account settles\nover; the per-rail fields below say which credits each number may\nactually be quoted for."
          },
          "rtp_routing_number": {
            "type": [
              "string",
              "null"
            ],
            "description": "ABA routing number to quote for an instant (RTP) credit, when the\nissuing bank publishes one distinct from `ach_routing_number`.\nAbsent otherwise — including for every account that settles over\nACH and wire only, which is the common case."
          },
          "swift_account_number": {
            "type": [
              "string",
              "null"
            ],
            "description": "The account number a foreign sender quotes for an international\nwire. Frequently the same digits as `account_number` — most\nissuing banks receive both legs at one number, and this reports\nthem rather than leaving the international route unaddressed.\nNot always: the payment can be received through a correspondent,\nin which case this is the number at that bank and can be an IBAN.\nQuote this one, not `account_number`. Absent on an account\nregistered from supplied details that named no international\nnumber."
          },
          "swift_receiving_bank": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "$ref": "#/components/schemas/ApiBankParty",
                "description": "The bank an inbound international wire lands at. Usually the bank\nin `bank_name`, and reported as such — but the two rails need not\nland at the same institution: `bank_name` and `bank_address`\ndescribe where a domestic credit arrives, and this describes where\nan international one does. Absent on an account registered from\nsupplied details, and on one whose issuing bank has not published\nits own details yet."
              }
            ]
          }
        }
      },
      "ApprovalStatus": {
        "type": "string",
        "description": "Where an approval stands, in the only terms a caller can act on. The\nverbatim upstream wording is preserved alongside as `status_detail` for\noperators who need the review stage.",
        "enum": [
          "approved",
          "pending",
          "action_required",
          "rejected",
          "not_started"
        ]
      },
      "ArgentineAccount": {
        "allOf": [
          {
            "$ref": "#/components/schemas/Payee"
          },
          {
            "$ref": "#/components/schemas/ArgentineAccountId"
          }
        ],
        "description": "`coelsa`, `t3.0`: a `cbu` or an `alias`, never both."
      },
      "ArgentineAccountId": {
        "oneOf": [
          {
            "type": "object",
            "description": "CBU or CVU, 22 digits.",
            "required": [
              "cbu"
            ],
            "properties": {
              "cbu": {
                "type": "string"
              }
            }
          },
          {
            "type": "object",
            "required": [
              "alias"
            ],
            "properties": {
              "alias": {
                "type": "string"
              }
            }
          }
        ]
      },
      "AssociatedPerson": {
        "type": "object",
        "description": "A UBO, officer, director, or authorized signer of the business.",
        "properties": {
          "address": {
            "$ref": "#/components/schemas/Address"
          },
          "citizenship": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 2,
            "minLength": 2
          },
          "country_of_birth": {
            "type": [
              "string",
              "null"
            ],
            "description": "Country of birth (ISO-3166-1 alpha-2). Distinct from `nationality`\nand `citizenship` — a person can be born somewhere they hold neither.",
            "maxLength": 2,
            "minLength": 2
          },
          "customer_id": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid",
            "description": "The individual customer this person is asserted to be. Set it to\nreuse that customer's verification instead of verifying the same\nhuman twice; Seismic accepts the link only when the identifying\ndetails match exactly. Available on business customers only."
          },
          "date_of_birth": {
            "type": [
              "string",
              "null"
            ],
            "format": "date"
          },
          "documents": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/KybDocumentRef"
            },
            "description": "Metadata (filename/size/type/date) for the documents referenced\nby the `*_document_id` fields above. Populated on read; ignored\non write (the document ids are the source of truth)."
          },
          "email": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 254
          },
          "first_name": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 128
          },
          "gender": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "$ref": "#/components/schemas/Gender"
              }
            ]
          },
          "gov_id_back_image_document_id": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid"
          },
          "gov_id_country": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 2,
            "minLength": 2
          },
          "gov_id_expiration_date": {
            "type": [
              "string",
              "null"
            ],
            "format": "date",
            "description": "Date the government ID expires (`YYYY-MM-DD`). Optional in general,\nbut required by some jurisdictions before an account can be opened —\nnotably AED."
          },
          "gov_id_front_image_document_id": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid"
          },
          "gov_id_issuance_date": {
            "type": [
              "string",
              "null"
            ],
            "format": "date",
            "description": "Date the government ID was issued (`YYYY-MM-DD`). Optional."
          },
          "gov_id_kind": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "$ref": "#/components/schemas/GovIdKind",
                "description": "Government ID metadata plus image document references. Required\nat submit unless the person completes the hosted verification\nform instead."
              }
            ]
          },
          "gov_id_number": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 64
          },
          "id": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid",
            "description": "Stable per-person id assigned on first persistence. Omitted on\ncreate; required by callers (e.g. document upload) to address a\nspecific UBO row."
          },
          "last_name": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 128
          },
          "middle_name": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 128
          },
          "nationality": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 2,
            "minLength": 2
          },
          "ownership_percent": {
            "type": [
              "string",
              "null"
            ],
            "description": "This person's stake in the business, as a percentage with up to two\ndecimal places (e.g. `\"33.33\"`). Sent as a decimal string. Sums across\nall associated persons must not exceed 100; decimals let fractional\nstakes sum to 100 rather than being forced to whole numbers that\novershoot.",
            "example": "33.33"
          },
          "phone": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 32
          },
          "phone_country_code": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 8
          },
          "previous_economic_activity": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/EconomicActivity"
            },
            "description": "What this person does for a living. A set, because more than one can\napply at once; an empty array means unanswered."
          },
          "proof_of_address_document_id": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid"
          },
          "relationship_established_at": {
            "type": [
              "string",
              "null"
            ],
            "format": "date",
            "description": "Calendar date the business's relationship with this person\nbegan. Required at submit, optional in the draft."
          },
          "roles": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/KybAssociatedPersonRole"
            },
            "description": "Set of roles this person holds at the business. Must be\nnon-empty at submit time."
          },
          "selfie_document_id": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid"
          },
          "source_of_wealth": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "$ref": "#/components/schemas/SourceOfWealth",
                "description": "Where this person's overall wealth came from — the net-worth\nquestion, as opposed to `primary_source_of_funds`, the business's\nhistorical source of funds: where its funds have come from to date."
              }
            ]
          },
          "tax_id": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 64
          },
          "tax_id_type": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "$ref": "#/components/schemas/TaxIdType",
                "description": "Which US taxpayer identifier `tax_id` is: `ssn` or `itin`. Read only\nfor a person whose address is in the US and ignored elsewhere. When\nomitted, a US person is treated as an SSN holder. Required for US\naddresses from November 14, 2026."
              }
            ]
          },
          "title": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 128
          },
          "transliterated_first_name": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 128
          },
          "transliterated_last_name": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 128
          },
          "transliterated_middle_name": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 128
          }
        }
      },
      "AssociatedPersonDocuments": {
        "type": "object",
        "description": "The documents of one associated person on a business customer.",
        "required": [
          "person_id",
          "documents"
        ],
        "properties": {
          "documents": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/KybDocumentRef"
            },
            "description": "The person's documents, oldest first."
          },
          "person_id": {
            "type": "string",
            "format": "uuid",
            "description": "The associated person's id, as on `profile.associated_persons[].id`."
          }
        }
      },
      "AsyncQuoteSnapshot": {
        "type": "object",
        "description": "View of a stored quote request: its lifecycle `status`, the ranked\n`quotes[]` priced so far, and an echo of the resolved request.",
        "required": [
          "id",
          "status",
          "quotes",
          "created_at",
          "request"
        ],
        "properties": {
          "best_quote_id": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid",
            "description": "`id` of the server's recommended quote. Matches `quotes[0].id`\ntoday (the array is ranked) — exposed explicitly so clients\ndon't have to depend on the ordering invariant."
          },
          "created_at": {
            "type": "string",
            "format": "date-time"
          },
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "quotes": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ApiQuote"
            },
            "description": "Ranked best-first across every eligible rail."
          },
          "request": {
            "$ref": "#/components/schemas/QuoteRequestEcho"
          },
          "status": {
            "$ref": "#/components/schemas/QuoteRequestStatus"
          }
        }
      },
      "BrAccountSubtype": {
        "type": "string",
        "description": "TED account subtype on the `br_bank` shape. Transfers with the\nwrong account type are rejected by the receiving bank, so the\ndestination's type must be supplied at registration.",
        "enum": [
          "cc",
          "pp"
        ]
      },
      "BrazilianBankAccount": {
        "allOf": [
          {
            "$ref": "#/components/schemas/Payee"
          },
          {
            "type": "object",
            "required": [
              "bank_code",
              "branch_code",
              "account_number"
            ],
            "properties": {
              "account_number": {
                "type": "string"
              },
              "account_subtype": {
                "oneOf": [
                  {
                    "type": "null"
                  },
                  {
                    "$ref": "#/components/schemas/BrAccountSubtype",
                    "description": "`cc` (checking) or `pp` (savings), as on a `br_bank` account. A TED\nsent to the wrong account type is rejected by the receiving bank."
                  }
                ]
              },
              "bank_code": {
                "type": "string",
                "description": "COMPE code of the receiving bank."
              },
              "branch_code": {
                "type": "string",
                "description": "Branch (agência)."
              },
              "tax_number": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Account holder's CNPJ or CPF."
              }
            }
          }
        ],
        "description": "`ted`."
      },
      "BusinessClassification": {
        "type": "string",
        "description": "How a business positions itself between a payer and a payee. Drives\n`acting_as_intermediary`.",
        "enum": [
          "marketplace",
          "financial_services_provider",
          "none_of_the_above"
        ]
      },
      "CoBankAccountType": {
        "type": "string",
        "description": "Account type on the `co_bank` shape. ACH Colombia credits a savings\n(ahorros) and a checking (corriente) account differently, so the\ndestination's type must be supplied at registration.",
        "enum": [
          "CHECKING",
          "SAVINGS"
        ]
      },
      "CoIdType": {
        "type": "string",
        "description": "The identity document a Colombian beneficiary is known by. The\nreceiving bank matches the holder against it, so the kind travels\nwith the number.",
        "enum": [
          "CC",
          "CE",
          "NIT",
          "PASS",
          "PEP"
        ]
      },
      "CorridorDirection": {
        "type": "string",
        "description": "Which leg of a quote a currency/rail pair may be used on.\n\nReads across the whole platform: a pair is `both` as soon as value can\nmove in over it and out over it, even when no single settlement path\ndoes both halves.",
        "enum": [
          "source",
          "destination",
          "both"
        ]
      },
      "CounterpartyType": {
        "type": "string",
        "enum": [
          "self_transactions",
          "merchants_suppliers",
          "customers",
          "employees",
          "contractors",
          "friends",
          "family"
        ]
      },
      "CreateAccountResponse": {
        "type": "object",
        "description": "Response body for every `POST /v0/customers/:id/accounts/{kind}/{origin}`.\n`request` always present; `account` populated synchronously for\n`origin: external` (caller supplied the details), `null` for\n`origin: virtual` until Seismic provisions the bank / wallet\ndetails.",
        "required": [
          "request"
        ],
        "properties": {
          "account": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "$ref": "#/components/schemas/ApiAccount"
              }
            ]
          },
          "request": {
            "$ref": "#/components/schemas/ApiAccountCreationRequest"
          }
        }
      },
      "CreateArCbuFiatDetails": {
        "type": "object",
        "required": [
          "cbu",
          "tax_number",
          "phone",
          "bank_name",
          "bank_address"
        ],
        "properties": {
          "alias": {
            "type": [
              "string",
              "null"
            ],
            "description": "Optional registered alias for the same account (6–20 chars,\nletters/digits/dots/hyphens)."
          },
          "bank_address": {
            "$ref": "#/components/schemas/Address"
          },
          "bank_name": {
            "type": "string",
            "description": "Bank display name — required by this corridor."
          },
          "cbu": {
            "type": "string",
            "description": "22-digit CBU (8 bank+branch + 14 account+checksums)."
          },
          "id_number": {
            "type": [
              "string",
              "null"
            ],
            "description": "Holder government ID number. Individuals only. Some routes on\nthis corridor require it —\n`GET /v0/accounts/fiat/external/requirements` returns the live\nrecipe."
          },
          "id_type": {
            "type": [
              "string",
              "null"
            ],
            "description": "Kind of ID `id_number` carries. Individuals only; the\nrequirements endpoint lists the accepted values."
          },
          "phone": {
            "type": "string",
            "description": "Holder contact phone. Required by this corridor; carried on the\ndetail block and settles against the account holder downstream."
          },
          "registration_number": {
            "type": [
              "string",
              "null"
            ],
            "description": "Business registration number. Businesses only. Some routes on\nthis corridor require it."
          },
          "registration_type": {
            "type": [
              "string",
              "null"
            ],
            "description": "Kind of registration `registration_number` carries. Businesses\nonly; the requirements endpoint lists the accepted values."
          },
          "tax_number": {
            "type": "string",
            "description": "Holder CUIT (11 digits). Required by this corridor; carried on\nthe detail block and settles against the account holder\ndownstream."
          }
        },
        "additionalProperties": false
      },
      "CreateAuBsbFiatDetails": {
        "type": "object",
        "required": [
          "bsb",
          "account_number",
          "bank_address"
        ],
        "properties": {
          "account_number": {
            "type": "string",
            "description": "Destination bank account number (6-10 digits)."
          },
          "bank_address": {
            "$ref": "#/components/schemas/Address"
          },
          "bsb": {
            "type": "string",
            "description": "BSB (\"Bank-State-Branch\", 6 digits) — names the bank and the\nbranch together, and is the whole routing key for this corridor."
          }
        },
        "additionalProperties": false
      },
      "CreateBrBankFiatDetails": {
        "type": "object",
        "required": [
          "bank_code",
          "agency",
          "account_number",
          "account_subtype",
          "bank_address"
        ],
        "properties": {
          "account_number": {
            "type": "string",
            "description": "Account number, optionally with a trailing `-N` check digit."
          },
          "account_subtype": {
            "$ref": "#/components/schemas/BrAccountSubtype",
            "description": "`cc` (conta corrente / checking) or `pp` (conta poupança /\nsavings) — required by BACEN's STR at routing time."
          },
          "agency": {
            "type": "string",
            "description": "Branch (\"agência\"): 4 digits, optionally with a trailing check\ndigit."
          },
          "bank_address": {
            "$ref": "#/components/schemas/Address"
          },
          "bank_code": {
            "type": "string",
            "description": "COMPE (3 digits) or ISPB (8 digits) bank identifier — either is\naccepted."
          },
          "bank_name": {
            "type": [
              "string",
              "null"
            ],
            "description": "Bank display name. Optional — settlement routes off\n`bank_code`; included for UI / statement context."
          },
          "id_number": {
            "type": [
              "string",
              "null"
            ],
            "description": "Holder government ID number. Individuals only. Some routes on\nthis corridor require it."
          },
          "id_type": {
            "type": [
              "string",
              "null"
            ],
            "description": "Kind of ID `id_number` carries (e.g. Tax Identification Number).\nIndividuals only; the requirements endpoint lists the accepted\nvalues."
          },
          "phone": {
            "type": [
              "string",
              "null"
            ],
            "description": "Holder contact phone. Some routes on this corridor require it —\n`GET /v0/accounts/fiat/external/requirements` returns the live\nrecipe."
          },
          "registration_number": {
            "type": [
              "string",
              "null"
            ],
            "description": "Business registration number (e.g. CNPJ). Businesses only. Some\nroutes on this corridor require it."
          },
          "registration_type": {
            "type": [
              "string",
              "null"
            ],
            "description": "Kind of registration `registration_number` carries. Businesses\nonly; the requirements endpoint lists the accepted values."
          },
          "tax_number": {
            "type": [
              "string",
              "null"
            ],
            "description": "Holder CPF (11 digits) or CNPJ (14 digits). Carried on the\ndetail block for a single BR-shaped request body; settles\nagainst the account holder's compliance record downstream."
          }
        },
        "additionalProperties": false
      },
      "CreateBrPixFiatDetails": {
        "type": "object",
        "required": [
          "pix_key",
          "pix_key_type",
          "bank_address"
        ],
        "properties": {
          "bank_address": {
            "$ref": "#/components/schemas/Address",
            "description": "Physical mailing address registered with the bank (wire-routing\n/ compliance). Distinct from the holder's own address."
          },
          "pix_key": {
            "type": "string",
            "description": "PIX key — format depends on `pix_key_type` (CPF 11 digits, CNPJ\n14 digits, email, `+55…` phone, or an EVP UUID). BACEN's\ndirectory routes key → bank → account, so the key + kind is the\nwhole identifier set."
          },
          "pix_key_type": {
            "$ref": "#/components/schemas/PixKeyKind"
          }
        },
        "additionalProperties": false
      },
      "CreateCaEftFiatDetails": {
        "type": "object",
        "required": [
          "institution_number",
          "transit_number",
          "account_number",
          "bank_name",
          "bank_address"
        ],
        "properties": {
          "account_number": {
            "type": "string",
            "description": "Destination bank account number (7-12 digits)."
          },
          "bank_address": {
            "$ref": "#/components/schemas/Address"
          },
          "bank_name": {
            "type": "string",
            "description": "Destination bank, as named in the `details.bank_name` options of\n`GET /v0/accounts/fiat/external/requirements` for this corridor."
          },
          "institution_number": {
            "type": "string",
            "description": "Institution number (3 digits) — identifies the bank."
          },
          "transit_number": {
            "type": "string",
            "description": "Transit number (5 digits) — identifies the branch."
          }
        },
        "additionalProperties": false
      },
      "CreateCnyFiatDetails": {
        "type": "object",
        "required": [
          "account_number",
          "cnaps_code",
          "id_number",
          "bank_address"
        ],
        "properties": {
          "account_number": {
            "type": "string",
            "description": "Chinese domestic bank account number (alphanumeric)."
          },
          "bank_address": {
            "$ref": "#/components/schemas/Address",
            "description": "Physical mailing address registered with the bank (wire-routing\n/ compliance). Distinct from the holder's own address."
          },
          "bank_name": {
            "type": [
              "string",
              "null"
            ],
            "description": "Bank display name. Optional — settlement routes off\n`cnaps_code`; included for UI / statement context. Seismic\nfills it in for virtual accounts."
          },
          "branch_name": {
            "type": [
              "string",
              "null"
            ],
            "description": "Destination bank branch name, in Hanzi (Chinese characters).\nBusinesses only. Some routes on this corridor require it —\n`GET /v0/accounts/fiat/external/requirements` returns the live\nrecipe."
          },
          "cnaps_code": {
            "type": "string",
            "description": "CNAPS code (China National Advanced Payment System) — the\n12-digit bank-branch identifier that routes the transfer."
          },
          "id_number": {
            "type": "string",
            "description": "Holder tax / government ID number (PRC resident ID card, tax\nnumber, …). Carried on the CNY detail block for a single\nCNY-shaped request body; settles against the account holder's\ncompliance record downstream."
          },
          "id_type": {
            "type": [
              "string",
              "null"
            ],
            "description": "Kind of ID `id_number` carries (e.g. Chinese Resident ID Card\nNumber). Individuals only; the requirements endpoint lists the\naccepted values."
          },
          "registration_number": {
            "type": [
              "string",
              "null"
            ],
            "description": "Business registration number (e.g. Unified Social Credit Code).\nBusinesses only. Some routes on this corridor require it —\n`GET /v0/accounts/fiat/external/requirements` returns the live\nrecipe."
          },
          "registration_type": {
            "type": [
              "string",
              "null"
            ],
            "description": "Kind of registration `registration_number` carries. Businesses\nonly; the requirements endpoint lists the accepted values."
          }
        },
        "additionalProperties": false
      },
      "CreateCoBankFiatDetails": {
        "type": "object",
        "description": "Colombian bank account, settled over ACH Colombia.",
        "required": [
          "bank_code",
          "account_number",
          "account_type",
          "id_type",
          "id_number",
          "bank_address"
        ],
        "properties": {
          "account_number": {
            "type": "string",
            "description": "Destination bank account number (6-20 digits)."
          },
          "account_type": {
            "$ref": "#/components/schemas/CoBankAccountType",
            "description": "Whether the destination is a checking (corriente) or savings\n(ahorros) account; the receiving bank credits them differently."
          },
          "bank_address": {
            "$ref": "#/components/schemas/Address"
          },
          "bank_code": {
            "type": "string",
            "description": "Bank code (1-8 digits) as published by the Colombian banking\nassociation; `GET /v0/accounts/fiat/external/requirements` lists\nthe accepted values."
          },
          "id_number": {
            "type": "string",
            "description": "The holder's identity document number (4-20 alphanumerics)."
          },
          "id_type": {
            "$ref": "#/components/schemas/CoIdType",
            "description": "Kind of identity document `id_number` carries."
          }
        },
        "additionalProperties": false
      },
      "CreateCustomerRequest": {
        "oneOf": [
          {
            "type": "object",
            "required": [
              "profile",
              "type"
            ],
            "properties": {
              "profile": {
                "$ref": "#/components/schemas/KycProfile"
              },
              "sandbox_auto_approve_kyc": {
                "type": [
                  "boolean",
                  "null"
                ]
              },
              "type": {
                "type": "string",
                "enum": [
                  "individual"
                ]
              }
            }
          },
          {
            "type": "object",
            "required": [
              "profile",
              "type"
            ],
            "properties": {
              "profile": {
                "$ref": "#/components/schemas/KybProfile"
              },
              "sandbox_auto_approve_kyc": {
                "type": [
                  "boolean",
                  "null"
                ]
              },
              "type": {
                "type": "string",
                "enum": [
                  "business"
                ]
              }
            }
          }
        ],
        "description": "`POST /v0/customers` body, discriminated on `type`.\n\n`sandbox_auto_approve_kyc` controls the later submission's timing in\nsandbox. When true (or omitted), `POST /kyc/submit` returns the final\napproval immediately. When false, submission returns `pending` and\nadvances asynchronously; a fast first update may already report\n`under_review`. Customer creation itself never submits.\nExplicit true is rejected with 400 in production."
      },
      "CreateCustomerResponse": {
        "oneOf": [
          {
            "type": "object",
            "required": [
              "id",
              "kyc_link",
              "type"
            ],
            "properties": {
              "id": {
                "type": "string",
                "format": "uuid"
              },
              "kyc_link": {
                "$ref": "#/components/schemas/HostedKycLink"
              },
              "type": {
                "type": "string",
                "enum": [
                  "individual"
                ]
              }
            }
          },
          {
            "type": "object",
            "required": [
              "id",
              "kyc_link",
              "type"
            ],
            "properties": {
              "id": {
                "type": "string",
                "format": "uuid"
              },
              "kyc_link": {
                "$ref": "#/components/schemas/HostedKycLink"
              },
              "type": {
                "type": "string",
                "enum": [
                  "business"
                ]
              }
            }
          }
        ],
        "description": "`POST /v0/customers` response. Includes the freshly-minted hosted\nKYC link so partners can email it to their customer in the same\nflow they used to create the row."
      },
      "CreateExternalCryptoAccountRequest": {
        "type": "object",
        "description": "Body of `POST /v0/customers/:id/accounts/crypto/external` — caller\nalready has the wallet and is registering it. `address` is the\nwallet's public address.",
        "required": [
          "address",
          "rail",
          "currency"
        ],
        "properties": {
          "account_holder": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "$ref": "#/components/schemas/AccountHolderInput",
                "description": "Whoever owns the destination wallet — may be the customer or a\nthird party. Optional: when omitted, Seismic derives the holder\nfrom the customer's own KYB/KYC profile. Supply it explicitly to\nregister a wallet owned by a third party."
              }
            ]
          },
          "address": {
            "type": "string"
          },
          "currency": {
            "$ref": "#/components/schemas/IdOrName"
          },
          "rail": {
            "$ref": "#/components/schemas/IdOrName"
          },
          "shape": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "$ref": "#/components/schemas/CryptoShape",
                "description": "Inferred from `rail` when omitted: `evm` for EVM networks, `sol`\nfor Solana. When supplied, must match the rail."
              }
            ]
          }
        }
      },
      "CreateExternalFiatAccountRequest": {
        "type": "object",
        "description": "Body of `POST /v0/customers/:id/accounts/fiat/external` — caller\nalready has the bank account and is registering it. The `details`\nblock carries the bank-specific identifiers; its expected shape is\ndetermined by `currency`, bank country, and the `rails` named.",
        "required": [
          "currency",
          "account_holder",
          "details"
        ],
        "properties": {
          "account_holder": {
            "$ref": "#/components/schemas/AccountHolderInput",
            "description": "The legal entity that owns the destination bank account. May be\nthe customer themselves OR a third party (vendor, employer,\ncounterparty). Required."
          },
          "currency": {
            "$ref": "#/components/schemas/IdOrName"
          },
          "details": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/CreateUsBankFiatDetails"
              },
              {
                "$ref": "#/components/schemas/CreateUkFiatDetails"
              },
              {
                "$ref": "#/components/schemas/CreateIbanFiatDetails"
              },
              {
                "$ref": "#/components/schemas/CreateSwiftFiatDetails"
              },
              {
                "$ref": "#/components/schemas/CreateCnyFiatDetails"
              },
              {
                "$ref": "#/components/schemas/CreateHkdFiatDetails"
              },
              {
                "$ref": "#/components/schemas/CreateSgdFiatDetails"
              },
              {
                "$ref": "#/components/schemas/CreateBrPixFiatDetails"
              },
              {
                "$ref": "#/components/schemas/CreateBrBankFiatDetails"
              },
              {
                "$ref": "#/components/schemas/CreateMxClabeFiatDetails"
              },
              {
                "$ref": "#/components/schemas/CreateInIfscFiatDetails"
              },
              {
                "$ref": "#/components/schemas/CreateArCbuFiatDetails"
              },
              {
                "$ref": "#/components/schemas/CreatePhBankFiatDetails"
              },
              {
                "$ref": "#/components/schemas/CreatePkIbanFiatDetails"
              },
              {
                "$ref": "#/components/schemas/CreateNgBankFiatDetails"
              },
              {
                "$ref": "#/components/schemas/CreateThbBankFiatDetails"
              },
              {
                "$ref": "#/components/schemas/CreateIdrBankFiatDetails"
              },
              {
                "$ref": "#/components/schemas/CreateCaEftFiatDetails"
              },
              {
                "$ref": "#/components/schemas/CreateJpZenginFiatDetails"
              },
              {
                "$ref": "#/components/schemas/CreateAuBsbFiatDetails"
              },
              {
                "$ref": "#/components/schemas/CreateCoBankFiatDetails"
              }
            ]
          },
          "rails": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "$ref": "#/components/schemas/RailSelection",
                "description": "Intended settlement rails, by catalog name — either a list of\nthem (`[\"ach\", \"wire\"]`) or a single name (`\"ach\"`).\n\nAlso accepted under the name `rail`, which is what integrations\nwritten before this field took a list send. Either name takes\neither form, `rails` is the canonical spelling and the one this\nschema describes, and a body supplying both names is rejected.\n\nNaming one rail registers the account for that rail only,\nagainst the bank identifier supplied in `details`. Naming\nseveral registers that same identifier for each of them, which\nasserts that the one identifier receives all of them — true of\nmost US banks for `ach` and `wire`, not of all of them. Where a\nUS bank publishes a different ABA per rail, name both rails and\nsend `details.ach_routing_number` /\n`details.fedwire_routing_number` in place of the single\n`details.routing_number`.\n\n`rails` is required on a USD account at a US bank (`ach` and/or\n`wire`), and a create that omits it there is rejected. Name every\nrail this destination is to be paid over. Elsewhere it stays\noptional: ARS defaults to `coelsa` (select `t3.0` explicitly), HKD\nto `fps`, and every other currency to all of its rails.\n\n`swift` is not among the US rails: a domestic US destination is\nreached over ACH or Fedwire, not by a cross-border wire. A USD\naccount that settles over `swift` is registered by naming that\nrail and sending the SWIFT identifiers (`bic`, `bank_name`) in\n`details` in place of a routing number, which selects the SWIFT\nshape.\n\nShapes with a single rail are unambiguous and keep accepting an\nomitted `rails`. A rail an account gains later is added through\n`POST /v0/customers/{id}/accounts/fiat/{account_id}/rails`.\n\nRail names are case-insensitive, repeats are collapsed, and an\nempty list is rejected.\n\nAccounts already registered are unaffected — this shapes creates\nonly."
              }
            ]
          }
        }
      },
      "CreateHkdFiatDetails": {
        "type": "object",
        "required": [
          "account_number",
          "bank_address"
        ],
        "properties": {
          "account_number": {
            "type": "string",
            "description": "Destination bank account number (digits only)."
          },
          "bank_address": {
            "$ref": "#/components/schemas/Address",
            "description": "Physical mailing address registered with the bank (wire-routing\n/ compliance). Distinct from the holder's own address."
          },
          "bank_name": {
            "type": [
              "string",
              "null"
            ],
            "description": "Bank display name. Optional — routing for this corridor is keyed\noff `bic` since 2026-07-31; included for UI / statement context."
          },
          "bic": {
            "type": [
              "string",
              "null"
            ],
            "description": "ISO 9362 BIC / SWIFT code of the destination bank — this\ncorridor's routing identifier, required since 2026-07-31. `GET\n/v0/accounts/fiat/external/requirements` returns the live recipe."
          },
          "date_of_incorporation": {
            "type": [
              "string",
              "null"
            ],
            "description": "Date the business was incorporated, as `YYYY-MM-DD`. Businesses\nonly."
          },
          "registration_number": {
            "type": [
              "string",
              "null"
            ],
            "description": "Business registration number (e.g. Certificate of Incorporation\nnumber). Businesses only. Some routes on this corridor require\nit — `GET /v0/accounts/fiat/external/requirements` returns the\nlive recipe."
          },
          "registration_type": {
            "type": [
              "string",
              "null"
            ],
            "description": "Kind of registration `registration_number` carries. Businesses\nonly; the requirements endpoint lists the accepted values."
          }
        },
        "additionalProperties": false
      },
      "CreateIbanFiatDetails": {
        "type": "object",
        "required": [
          "account_number",
          "bank_address"
        ],
        "properties": {
          "account_number": {
            "type": "string",
            "description": "IBAN string."
          },
          "bank_address": {
            "$ref": "#/components/schemas/Address"
          },
          "bank_code": {
            "type": [
              "string",
              "null"
            ],
            "description": "Domestic bank code (e.g. Swedish clearing number). Some routes\non IBAN corridors require it."
          },
          "bank_name": {
            "type": [
              "string",
              "null"
            ],
            "description": "Bank display name. Optional — settlement on this corridor routes\noff the IBAN's embedded bank code; included for UI / statement\ncontext. Seismic fills it in for virtual accounts."
          },
          "bic": {
            "type": [
              "string",
              "null"
            ],
            "description": "Optional BIC / SWIFT code. SEPA-only payments don't need it;\nnon-SEPA cross-border does."
          },
          "id_number": {
            "type": [
              "string",
              "null"
            ],
            "description": "Holder government ID number. Individuals only. Some routes on\nIBAN corridors require it."
          },
          "id_type": {
            "type": [
              "string",
              "null"
            ],
            "description": "Kind of ID `id_number` carries. Individuals only; the\nrequirements endpoint lists the accepted values."
          },
          "phone": {
            "type": [
              "string",
              "null"
            ],
            "description": "Holder contact phone. Some routes on IBAN corridors (e.g. AED)\nrequire it — `GET /v0/accounts/fiat/external/requirements`\nreturns the live recipe."
          },
          "registration_number": {
            "type": [
              "string",
              "null"
            ],
            "description": "Business registration number. Businesses only. Some routes on\nIBAN corridors require it."
          },
          "registration_type": {
            "type": [
              "string",
              "null"
            ],
            "description": "Kind of registration `registration_number` carries. Businesses\nonly; the requirements endpoint lists the accepted values."
          }
        },
        "additionalProperties": false
      },
      "CreateIdrBankFiatDetails": {
        "type": "object",
        "required": [
          "account_number",
          "bank_name",
          "bank_address"
        ],
        "properties": {
          "account_number": {
            "type": "string",
            "description": "Destination bank account number (digits only)."
          },
          "bank_address": {
            "$ref": "#/components/schemas/Address"
          },
          "bank_name": {
            "type": "string",
            "description": "Bank display name — routing for this corridor is keyed off the\nbank name rather than a numeric branch/routing code."
          }
        },
        "additionalProperties": false
      },
      "CreateInIfscFiatDetails": {
        "type": "object",
        "required": [
          "ifsc",
          "account_number",
          "bank_address"
        ],
        "properties": {
          "account_number": {
            "type": "string",
            "description": "Destination account number (9–20 digits; length is\nbank-specific)."
          },
          "bank_address": {
            "$ref": "#/components/schemas/Address"
          },
          "bank_name": {
            "type": [
              "string",
              "null"
            ],
            "description": "Bank display name. Optional — settlement routes off `ifsc`;\nincluded for UI / statement context."
          },
          "id_number": {
            "type": [
              "string",
              "null"
            ],
            "description": "Holder government ID number. Individuals only. Some routes on\nthis corridor require it."
          },
          "id_type": {
            "type": [
              "string",
              "null"
            ],
            "description": "Kind of ID `id_number` carries. Individuals only; the\nrequirements endpoint lists the accepted values."
          },
          "ifsc": {
            "type": "string",
            "description": "IFSC: 4-letter bank code + `0` + 6-char branch code."
          },
          "phone": {
            "type": [
              "string",
              "null"
            ],
            "description": "Holder contact phone. Some routes on this corridor require it —\n`GET /v0/accounts/fiat/external/requirements` returns the live\nrecipe."
          },
          "registration_number": {
            "type": [
              "string",
              "null"
            ],
            "description": "Business registration number. Businesses only. Some routes on\nthis corridor require it."
          },
          "registration_type": {
            "type": [
              "string",
              "null"
            ],
            "description": "Kind of registration `registration_number` carries. Businesses\nonly; the requirements endpoint lists the accepted values."
          },
          "relationship_to_debtor": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "$ref": "#/components/schemas/HolderRelationship",
                "description": "Relationship of the account holder to the customer, as one of\nthe corridor's fixed 4-letter codes (`SELF`, `EMPL`, `SUPP`, …).\nThe requirements endpoint lists the accepted codes with labels\nper holder kind."
              }
            ]
          }
        },
        "additionalProperties": false
      },
      "CreateIntermediaryBank": {
        "type": "object",
        "description": "The correspondent (intermediary) bank a cross-border payout is routed\nthrough, on the way to the destination bank named by the enclosing\ndetail block.\n\nEvery identifier here belongs to the correspondent, never to the\ndestination: a wire that quotes one bank's BIC under the other's name\nis a wire that bounces, which is why the two are separate blocks\nrather than sibling fields.",
        "properties": {
          "account_number": {
            "type": [
              "string",
              "null"
            ],
            "description": "The destination bank's account at the correspondent (8–34\nuppercase alphanumeric), which a cover payment credits on the way\nthrough. An IBAN or a domestic account string."
          },
          "bic": {
            "type": [
              "string",
              "null"
            ],
            "description": "The correspondent's own ISO 9362 BIC (8 or 11 chars) — not the\ndestination bank's, which is the enclosing block's `bic`. Quoted\nwhere the correspondent is outside the US and so has no ABA."
          },
          "country": {
            "type": [
              "string",
              "null"
            ],
            "description": "ISO-3166-1 alpha-2 country of the correspondent (`US`, `DE`, …).\nNot inferred from the other fields: a BIC's country letters name\nwhere the institution is registered, not where the branch that\nclears the wire sits."
          },
          "name": {
            "type": [
              "string",
              "null"
            ],
            "description": "Display name, 2–100 chars. What the sending bank prints on the\npayment instruction, and what a compliance screen reads."
          },
          "routing_number": {
            "type": [
              "string",
              "null"
            ],
            "description": "Nine-digit ABA of the correspondent, where it is a US bank — the\nrecipient bank's US correspondent, not the recipient bank itself.\nRequired for an individual account holder, optional for a business\naccount holder. Replaces the deprecated top-level\n`routing_number`."
          }
        },
        "additionalProperties": false
      },
      "CreateJpZenginFiatDetails": {
        "type": "object",
        "required": [
          "bank_code",
          "branch_code",
          "account_number",
          "bank_name",
          "phone",
          "bank_address"
        ],
        "properties": {
          "account_number": {
            "type": "string",
            "description": "Seven-digit domestic account number, including leading zeros."
          },
          "bank_address": {
            "$ref": "#/components/schemas/Address"
          },
          "bank_code": {
            "type": "string",
            "description": "Four-digit bank code, including leading zeros."
          },
          "bank_name": {
            "type": "string"
          },
          "branch_code": {
            "type": "string",
            "description": "Three-digit branch code, including leading zeros."
          },
          "phone": {
            "type": "string"
          }
        },
        "additionalProperties": false
      },
      "CreateMxClabeFiatDetails": {
        "type": "object",
        "required": [
          "clabe",
          "bank_address"
        ],
        "properties": {
          "bank_address": {
            "$ref": "#/components/schemas/Address"
          },
          "bank_name": {
            "type": [
              "string",
              "null"
            ],
            "description": "Bank display name. Optional — settlement routes off the CLABE's\nbank prefix; included for UI / statement context."
          },
          "clabe": {
            "type": "string",
            "description": "18-digit CLABE (3 bank + 3 branch + 11 account + 1 checksum) —\nthe whole identifier set for SPEI."
          },
          "tax_number": {
            "type": [
              "string",
              "null"
            ],
            "description": "Holder tax id (RFC), 10–18 chars. Some routes on this corridor\nrequire it — `GET /v0/accounts/fiat/external/requirements`\nreturns the live recipe."
          }
        },
        "additionalProperties": false
      },
      "CreateNgBankFiatDetails": {
        "type": "object",
        "required": [
          "account_number",
          "bank_code",
          "bank_address"
        ],
        "properties": {
          "account_number": {
            "type": "string",
            "description": "Destination NUBAN account number (10 digits)."
          },
          "bank_address": {
            "$ref": "#/components/schemas/Address"
          },
          "bank_code": {
            "type": "string",
            "description": "Numeric bank code (the NIBSS/CBN institution code) — the routing\nkey. A NUBAN is only unique within a bank, so the code is\nrequired."
          },
          "bank_name": {
            "type": [
              "string",
              "null"
            ],
            "description": "Bank display name. Optional — settlement routes off `bank_code`;\nincluded for UI / statement context."
          }
        },
        "additionalProperties": false
      },
      "CreatePhBankFiatDetails": {
        "type": "object",
        "required": [
          "account_number",
          "bank_name",
          "bank_address"
        ],
        "properties": {
          "account_number": {
            "type": "string",
            "description": "Destination bank account number (digits only)."
          },
          "bank_address": {
            "$ref": "#/components/schemas/Address"
          },
          "bank_name": {
            "type": "string",
            "description": "Bank display name — routing for this corridor is keyed off the\nbank name rather than a numeric branch/routing code."
          },
          "date_of_incorporation": {
            "type": [
              "string",
              "null"
            ],
            "description": "Date the business was incorporated, as `YYYY-MM-DD`. Businesses\nonly."
          },
          "phone": {
            "type": [
              "string",
              "null"
            ],
            "description": "Holder contact phone. Some routes on this corridor require it —\n`GET /v0/accounts/fiat/external/requirements` returns the live\nrecipe."
          },
          "registration_number": {
            "type": [
              "string",
              "null"
            ],
            "description": "Business registration number. Businesses only. Some routes on\nthis corridor require it."
          },
          "registration_type": {
            "type": [
              "string",
              "null"
            ],
            "description": "Kind of registration `registration_number` carries. Businesses\nonly; the requirements endpoint lists the accepted values."
          },
          "relationship_to_debtor": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "$ref": "#/components/schemas/HolderRelationship",
                "description": "Relationship of the account holder to the customer, as one of\nthe corridor's fixed 4-letter codes (`SELF`, `EMPL`, `SUPP`, …).\nThe requirements endpoint lists the accepted codes with labels\nper holder kind."
              }
            ]
          }
        },
        "additionalProperties": false
      },
      "CreatePkIbanFiatDetails": {
        "type": "object",
        "required": [
          "iban",
          "bank_address"
        ],
        "properties": {
          "bank_address": {
            "$ref": "#/components/schemas/Address"
          },
          "bank_name": {
            "type": [
              "string",
              "null"
            ],
            "description": "Bank display name. Optional — settlement routes off the IBAN's\nembedded bank code; included for UI / statement context."
          },
          "iban": {
            "type": "string",
            "description": "Pakistan IBAN (`PK` + 2 check digits + 4-letter bank code +\n16-char account, a fixed 24 characters) — the whole identifier\nset. Seismic settles over Raast off the IBAN's embedded bank code."
          }
        },
        "additionalProperties": false
      },
      "CreateQuoteBody": {
        "type": "object",
        "description": "Body for `POST /v0/quotes`.",
        "required": [
          "end_customer_id",
          "amount",
          "source",
          "destination"
        ],
        "properties": {
          "amount": {
            "type": "string",
            "description": "Amount to trade, denominated in the currency of the leg named\nby `amount_leg` (the source leg by default)."
          },
          "amount_leg": {
            "$ref": "#/components/schemas/AmountLeg",
            "description": "Which leg `amount` fixes. `source` (the default) prices what\nthe destination receives for a given pay-in; `destination`\nprices the pay-in required to deliver an exact destination\namount — use it to guarantee what the recipient receives."
          },
          "destination": {
            "$ref": "#/components/schemas/QuoteDestination"
          },
          "developer_fee_bps": {
            "type": [
              "integer",
              "null"
            ],
            "format": "int32",
            "description": "Your own developer fee in basis points (100 = 1%), added on top\nof the quoted rate. At most 999 (9.99%).",
            "minimum": 0
          },
          "developer_fee_flat": {
            "type": [
              "string",
              "null"
            ],
            "description": "Your own flat developer fee, as a decimal string in the source\nleg's currency (`\"1.50\"`). Charged in addition to\n`developer_fee_bps` and shown to your customer as its own fee\nline. Supported on stablecoin-funded payments; a quote that\nrequests one on an unsupported corridor is rejected rather than\npriced without it."
          },
          "end_customer_id": {
            "type": "string",
            "format": "uuid",
            "description": "The end customer this quote is for."
          },
          "end_customer_type": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "$ref": "#/components/schemas/CustomerKind",
                "description": "What `end_customer_id` refers to. Optional — when omitted,\nSeismic resolves the id — but passing it turns a mistyped id\ninto an immediate, descriptive error instead of resolving to a\nrecord you didn't mean."
              }
            ]
          },
          "payer": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "$ref": "#/components/schemas/QuotePayer",
                "description": "Who is paying, for pay-in rails that identify the payer when the\nquote is created rather than when the transfer lands. Required for\na `COP` pay-in over `pse` (every member, with `document_type` one of\n`CC` or `NIT` and `phone` a Colombian mobile number, `+573` followed\nby nine digits) and for an `ARS` pay-in (`tax_id`: the payer's\nCUIT/CUIL, 11 digits with no separators, which the pesos must be sent\nfrom); a quote missing or malforming any required member is rejected\nwith one violation per field. Ignored on other rails."
              }
            ]
          },
          "source": {
            "$ref": "#/components/schemas/LegRequest"
          }
        }
      },
      "CreateSgdFiatDetails": {
        "type": "object",
        "required": [
          "account_number",
          "bank_name",
          "phone",
          "bank_address"
        ],
        "properties": {
          "account_number": {
            "type": "string",
            "description": "Destination bank account number (alphanumeric)."
          },
          "bank_address": {
            "$ref": "#/components/schemas/Address",
            "description": "Physical mailing address registered with the bank (wire-routing\n/ compliance). Distinct from the holder's own address."
          },
          "bank_name": {
            "type": "string",
            "description": "Bank display name — routing for this corridor is keyed off the\nbank name rather than a numeric branch/routing code."
          },
          "id_number": {
            "type": [
              "string",
              "null"
            ],
            "description": "Holder government ID number (NRIC, FIN, passport number, …).\nIndividuals only. Some routes on this corridor require it —\n`GET /v0/accounts/fiat/external/requirements` returns the live\nrecipe."
          },
          "id_type": {
            "type": [
              "string",
              "null"
            ],
            "description": "Kind of ID `id_number` carries. Individuals only; the\nrequirements endpoint lists the accepted values."
          },
          "phone": {
            "type": "string",
            "description": "Holder contact phone. Required by this corridor; carried on the\ndetail block so the whole request lands in one `details` block\nand settles against the account holder downstream."
          },
          "registration_number": {
            "type": [
              "string",
              "null"
            ],
            "description": "Business registration number (e.g. Singapore UEN). Businesses\nonly. Some routes on this corridor require it."
          },
          "registration_type": {
            "type": [
              "string",
              "null"
            ],
            "description": "Kind of registration `registration_number` carries. Businesses\nonly; the requirements endpoint lists the accepted values."
          },
          "relationship_to_debtor": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "$ref": "#/components/schemas/HolderRelationship",
                "description": "Relationship of the account holder to the customer, as one of\nthe corridor's fixed 4-letter codes (`SELF`, `EMPL`, `VEND`, …).\nThe requirements endpoint lists the accepted codes with labels."
              }
            ]
          }
        },
        "additionalProperties": false
      },
      "CreateSwiftFiatDetails": {
        "type": "object",
        "required": [
          "bic",
          "account_number",
          "bank_name",
          "bank_address"
        ],
        "properties": {
          "account_number": {
            "type": "string",
            "description": "Destination account number reachable via SWIFT — an IBAN or a\ndomestic account string. Banks in IBAN countries (AE, SA, TR,\nand most of Europe) require the IBAN form. Loosely\nformat-checked here; Seismic validates the precise per-country\nform at registration."
          },
          "bank_address": {
            "$ref": "#/components/schemas/Address",
            "description": "Physical mailing address registered with the bank (wire-routing\n/ compliance). Distinct from the holder's own address."
          },
          "bank_name": {
            "type": "string",
            "description": "Bank display name. Required — SWIFT corridors that route USD off\na published bank list (e.g. USD held in HK) validate it against\nthat list."
          },
          "bic": {
            "type": "string",
            "description": "ISO 9362 BIC / SWIFT code (8 or 11 chars). Required — it is the\nidentifier SWIFT settlement routes off (unlike the IBAN shape,\nwhere the IBAN encodes the bank and the BIC is optional)."
          },
          "ifsc": {
            "type": [
              "string",
              "null"
            ],
            "description": "Indian Financial System Code of the recipient branch\n(`AAAA0NNNNNN`, e.g. `HDFC0001234`), for a bank in India. Some\nroutes require it there."
          },
          "intermediary_bank": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "$ref": "#/components/schemas/CreateIntermediaryBank",
                "description": "The correspondent bank the payout is routed through, where the\ncorridor needs it described rather than merely numbered.\n\nOptional, and so is every field inside it: which parts a corridor\nasks for varies, and `GET\n/v0/accounts/fiat/external/requirements` returns the live recipe."
              }
            ]
          },
          "phone": {
            "type": [
              "string",
              "null"
            ],
            "description": "Holder contact phone. Some routes on this shape require it —\n`GET /v0/accounts/fiat/external/requirements` returns the live\nrecipe."
          },
          "routing_number": {
            "type": [
              "string",
              "null"
            ],
            "description": "Deprecated: send `intermediary_bank.routing_number` instead.\n\nABA routing number of the recipient bank's US correspondent\n(intermediary) bank, the same nine digits as\n`intermediary_bank.routing_number`. Still accepted; supplying both\nwith different values is rejected.",
            "deprecated": true
          },
          "swift_payment_code": {
            "type": [
              "string",
              "null"
            ],
            "description": "Purpose-of-payment code for the payouts this account receives. Some\nroutes require one for a bank in certain countries; the values\naccepted for the bank's country are the `options` on this field in\n`GET /v0/accounts/fiat/external/requirements`."
          },
          "tax_number": {
            "type": [
              "string",
              "null"
            ],
            "description": "Holder tax identification number. Some routes on this shape\nrequire it."
          }
        },
        "additionalProperties": false
      },
      "CreateThbBankFiatDetails": {
        "type": "object",
        "required": [
          "account_number",
          "bank_name",
          "bank_address"
        ],
        "properties": {
          "account_number": {
            "type": "string",
            "description": "Destination bank account number (digits only)."
          },
          "bank_address": {
            "$ref": "#/components/schemas/Address"
          },
          "bank_name": {
            "type": "string",
            "description": "Bank display name — routing for this corridor is keyed off the\nbank name rather than a numeric branch/routing code."
          }
        },
        "additionalProperties": false
      },
      "CreateUkFiatDetails": {
        "type": "object",
        "required": [
          "sort_code",
          "account_number",
          "bank_address"
        ],
        "properties": {
          "account_number": {
            "type": "string"
          },
          "bank_address": {
            "$ref": "#/components/schemas/Address"
          },
          "bank_name": {
            "type": [
              "string",
              "null"
            ],
            "description": "Bank display name. Optional — settlement routes off\n`sort_code`; included for UI / statement context. Seismic fills\nit in for virtual accounts."
          },
          "iban": {
            "type": [
              "string",
              "null"
            ],
            "description": "Optional cross-border IBAN — the SWIFT-routable form of the\nsame `sort_code`/`account_number` pair. Supply it when the\naccount will receive non-UK-originated payments."
          },
          "sort_code": {
            "type": "string"
          }
        },
        "additionalProperties": false
      },
      "CreateUsBankFiatDetails": {
        "type": "object",
        "required": [
          "account_number",
          "bank_address"
        ],
        "properties": {
          "account_number": {
            "type": "string"
          },
          "account_type": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "$ref": "#/components/schemas/UsBankAccountType"
              }
            ]
          },
          "ach_routing_number": {
            "type": [
              "string",
              "null"
            ],
            "description": "ABA routing number the bank receives ACH credits on, where that\ndiffers from the one it receives wires on. Supply it instead of\n`routing_number`, not alongside it."
          },
          "bank_address": {
            "$ref": "#/components/schemas/Address",
            "description": "Physical mailing address registered with the bank (wire-routing\n/ compliance). Distinct from the holder's own address."
          },
          "bank_name": {
            "type": [
              "string",
              "null"
            ],
            "description": "Bank display name. Optional — settlement on this corridor routes\noff `routing_number`, so the supplied value is for the UI /\nstatements only. Seismic fills it in for virtual accounts."
          },
          "bic": {
            "type": [
              "string",
              "null"
            ],
            "description": "BIC / SWIFT code. Required when the selected wire registration\nrecipe requests it. Must be ISO 9362 format (8 or 11 characters)."
          },
          "fedwire_routing_number": {
            "type": [
              "string",
              "null"
            ],
            "description": "ABA routing number the bank receives Fedwire credits on, where\nthat differs from the one it receives ACH credits on. Supply it\ninstead of `routing_number`, not alongside it."
          },
          "id_number": {
            "type": [
              "string",
              "null"
            ]
          },
          "id_type": {
            "type": [
              "string",
              "null"
            ]
          },
          "phone": {
            "type": [
              "string",
              "null"
            ]
          },
          "registration_number": {
            "type": [
              "string",
              "null"
            ]
          },
          "registration_type": {
            "type": [
              "string",
              "null"
            ]
          },
          "routing_number": {
            "type": [
              "string",
              "null"
            ],
            "description": "ABA routing number that serves every rail named in `rails`.\n\nSend this on its own where the bank receives all of them on one\nnumber, which is the common case. Where it publishes a separate\nnumber per rail, send `ach_routing_number` and\n`fedwire_routing_number` instead — supplying this field\n*together with* either of them is rejected, because which number\nserves which rail would then be ours to guess."
          },
          "tax_number": {
            "type": [
              "string",
              "null"
            ],
            "description": "The holder's tax identification number in their country of\nresidence (for example a CPF for a holder in Brazil). Some routes\nrequire it for holders in certain countries — `GET\n/v0/accounts/fiat/external/requirements` lists which under\n`required_when`."
          }
        },
        "additionalProperties": false
      },
      "CreateVirtualFiatAccountRequest": {
        "type": "object",
        "description": "Body of `POST /v0/customers/:id/accounts/fiat/virtual` — caller asks\nSeismic to mint a virtual bank account. Shape and rails are both\ninferred from `currency` today (`USD` → `Us` over `[ach, wire]`;\n`EUR` → `Iban` over `[sepa, swift]`; …). A future iteration of this\nendpoint will accept optional `shape` / `rails` overrides — for now\nonly currency drives the choice.\n\n`liquidation` opts the account into auto-liquidation: fiat credited\nto the virtual account is automatically converted and settled to an\nexisting crypto account. Omit it for a plain virtual bank account.\n\n`bank` names where the account is held. Omit it and Seismic picks.",
        "required": [
          "currency"
        ],
        "properties": {
          "bank": {
            "type": [
              "string",
              "null"
            ],
            "description": "Bank to open the account at, as\n`GET /v0/customers/{id}/virtual-account-banks` spells it. Omit it and\na bank is chosen for you, which is what every account opened before\nthis field existed does.\n\nAlso what decides whether this create duplicates an account the\ncustomer already holds: one account per bank per currency, so a bank\nthey hold none at is a new account. Omitting it asks for an account in\nthe currency, which the one they hold answers.",
            "example": "PORTAGE_BANK"
          },
          "currency": {
            "$ref": "#/components/schemas/IdOrName"
          },
          "liquidation": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "$ref": "#/components/schemas/LiquidationInput"
              }
            ]
          }
        }
      },
      "CryptoDeposit": {
        "type": "object",
        "required": [
          "deposit_address"
        ],
        "properties": {
          "deposit_address": {
            "type": "string",
            "description": "Address to send `amount` of `currency` to, on the chain `rail` names."
          },
          "from_address": {
            "type": [
              "string",
              "null"
            ],
            "description": "The wallet the payment is expected from, when one was given."
          }
        }
      },
      "CryptoFundingInstructions": {
        "type": "object",
        "description": "A crypto payment: send `amount` of `currency` to `crypto.deposit_address`\non the chain `rail` names. Every chain carries the same details.",
        "required": [
          "currency",
          "amount",
          "rail",
          "crypto"
        ],
        "properties": {
          "amount": {
            "type": "string",
            "description": "Exact amount to send, as a decimal string. It can differ from\n`source.amount` by rounding to what the chain can carry."
          },
          "crypto": {
            "$ref": "#/components/schemas/CryptoDeposit"
          },
          "currency": {
            "type": "string",
            "description": "Currency to send, as on the order's `source.currency`."
          },
          "rail": {
            "$ref": "#/components/schemas/CryptoRail"
          }
        }
      },
      "CryptoRail": {
        "type": "string",
        "description": "The chain to send on, as on the order's `source.rail`.",
        "enum": [
          "arbitrum",
          "base",
          "ethereum",
          "polygon",
          "seismic",
          "solana",
          "tron"
        ]
      },
      "CryptoShape": {
        "type": "string",
        "description": "The VM family that determines a crypto account's address format.\nUnlike `FiatShape` where shape ≈ country, crypto shape is keyed on\nthe cryptographic primitive: one EVM key produces the same address\non every EVM chain, so a single shape spans chains — the chains an\naccount transacts on are listed in its `rails` instead.",
        "enum": [
          "evm",
          "sol",
          "tron",
          "btc"
        ]
      },
      "CurrenciesResp": {
        "type": "object",
        "required": [
          "currencies"
        ],
        "properties": {
          "currencies": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/CurrencyInfo"
            }
          }
        }
      },
      "CurrencyInfo": {
        "type": "object",
        "description": "One tradable currency and the rails it settles over.",
        "required": [
          "currency",
          "kind",
          "rails"
        ],
        "properties": {
          "currency": {
            "type": "string"
          },
          "kind": {
            "type": "string",
            "description": "`fiat`, `stablecoin`, or `crypto`."
          },
          "rails": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/CurrencyRailEntry"
            }
          }
        }
      },
      "CurrencyRailEntry": {
        "type": "object",
        "description": "One rail a currency settles over, and the legs it settles on.",
        "required": [
          "rail",
          "direction"
        ],
        "properties": {
          "direction": {
            "$ref": "#/components/schemas/CorridorDirection"
          },
          "min_amount": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "$ref": "#/components/schemas/MinAmount"
              }
            ]
          },
          "rail": {
            "type": "string"
          }
        }
      },
      "CustomerCategory": {
        "type": "string",
        "enum": [
          "individual",
          "business"
        ]
      },
      "CustomerKind": {
        "type": "string",
        "enum": [
          "individual",
          "business",
          "business_individual",
          "org"
        ]
      },
      "CustomerListItem": {
        "type": "object",
        "description": "One row in the `GET /v0/customers` response.",
        "required": [
          "id",
          "customer_type",
          "status",
          "pending_rfi",
          "created_at"
        ],
        "properties": {
          "created_at": {
            "type": "string",
            "format": "date-time"
          },
          "customer_type": {
            "$ref": "#/components/schemas/CustomerCategory"
          },
          "display_name": {
            "type": [
              "string",
              "null"
            ],
            "description": "Human-readable label: \"First Last\" for individuals, legal name for businesses.\n`None` when no name fields have been filled in yet."
          },
          "email": {
            "type": [
              "string",
              "null"
            ],
            "description": "Contact email from the customer's profile. `None` when none has been\nprovided yet."
          },
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "pending_rfi": {
            "type": "boolean",
            "description": "`true` while an open request for information is outstanding on this\nverification. Raised by Seismic compliance and independent of the\nstatus, so it can be `true` at any status; answering every open item\nclears it. Resubmitting the profile does not."
          },
          "status": {
            "$ref": "#/components/schemas/KyStatus"
          }
        }
      },
      "CustomerProfileEnvelope": {
        "oneOf": [
          {
            "type": "object",
            "required": [
              "profile",
              "kyc_link",
              "type"
            ],
            "properties": {
              "kyc_link": {
                "$ref": "#/components/schemas/HostedKycLink"
              },
              "profile": {
                "$ref": "#/components/schemas/KycProfile"
              },
              "type": {
                "type": "string",
                "enum": [
                  "individual"
                ]
              }
            }
          },
          {
            "type": "object",
            "required": [
              "profile",
              "kyc_link",
              "type"
            ],
            "properties": {
              "kyc_link": {
                "$ref": "#/components/schemas/HostedKycLink"
              },
              "profile": {
                "$ref": "#/components/schemas/KybProfile"
              },
              "type": {
                "type": "string",
                "enum": [
                  "business"
                ]
              }
            }
          }
        ],
        "description": "`GET /v0/customers/:id` and the response of `PUT\n/v0/customers/:id/kyc/profile` and `GET /v0/customers/:id/kyc/profile`.\nCarries the saved `profile` plus the hosted KYC link inline."
      },
      "CustomerStateEnvelope": {
        "oneOf": [
          {
            "type": "object",
            "required": [
              "state",
              "type"
            ],
            "properties": {
              "state": {
                "$ref": "#/components/schemas/KycState"
              },
              "type": {
                "type": "string",
                "enum": [
                  "individual"
                ]
              }
            }
          },
          {
            "type": "object",
            "required": [
              "state",
              "type"
            ],
            "properties": {
              "state": {
                "$ref": "#/components/schemas/KybState"
              },
              "type": {
                "type": "string",
                "enum": [
                  "business"
                ]
              }
            }
          }
        ],
        "description": "`POST /v0/customers/:id/kyc/{submit,resync}` + `GET /v0/customers/:id/kyc/state`."
      },
      "DocumentKind": {
        "type": "string",
        "enum": [
          "business_formation",
          "articles_of_association",
          "memorandum_of_association",
          "dba_registration",
          "bank_statement",
          "ubo_bank_statement",
          "ownership_information",
          "shareholder_register",
          "certificate_of_incumbency",
          "flow_of_funds",
          "proof_of_nature_of_business",
          "compliance_screening",
          "government_issued_id",
          "passport",
          "drivers_licence_front",
          "drivers_licence_back",
          "identity_card_front",
          "identity_card_back",
          "selfie",
          "proof_of_address",
          "ubo_source_of_funds",
          "tax_document",
          "licensed_vendors_attestation",
          "proof_of_licensure",
          "proof_of_verification",
          "supplemental",
          "other"
        ]
      },
      "DocumentListResponse": {
        "oneOf": [
          {
            "type": "object",
            "required": [
              "documents",
              "type"
            ],
            "properties": {
              "documents": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/KycDocumentRef"
                }
              },
              "type": {
                "type": "string",
                "enum": [
                  "individual"
                ]
              }
            }
          },
          {
            "type": "object",
            "required": [
              "documents",
              "associated_persons",
              "type"
            ],
            "properties": {
              "associated_persons": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/AssociatedPersonDocuments"
                },
                "description": "One entry per associated person on the profile, with that person's\ndocuments."
              },
              "documents": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/KybDocumentRef"
                },
                "description": "The business's own documents."
              },
              "type": {
                "type": "string",
                "enum": [
                  "business"
                ]
              }
            }
          }
        ]
      },
      "DocumentUploadForm": {
        "type": "object",
        "description": "Multipart form for `POST /v0/customers/{id}/kyc/documents`.",
        "required": [
          "kind",
          "file"
        ],
        "properties": {
          "description": {
            "type": [
              "string",
              "null"
            ],
            "description": "Free-text label, up to 256 characters. Required when `kind=other`\nunless `purpose=rfi_answer`; optional for every other kind."
          },
          "file": {
            "type": "string",
            "format": "binary",
            "description": "The file contents."
          },
          "kind": {
            "$ref": "#/components/schemas/DocumentKind",
            "description": "What the document is. Two-sided IDs upload each side under the\nmatching `*_front` / `*_back` kind; passports use `passport`."
          },
          "owner": {
            "type": [
              "string",
              "null"
            ],
            "description": "`customer` (default) or `person` — whose document this is."
          },
          "person_id": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid",
            "description": "Associated-person id; required when `owner=person`."
          },
          "proof_of_address_type": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "$ref": "#/components/schemas/ProofOfAddressType",
                "description": "What a `proof_of_address` is. Only accepted with\n`kind=proof_of_address`, and required on one: submit refuses a profile\nwhose proof of address has none. Re-uploading a file\nalready on record with a type sets the type on that document."
              }
            ]
          },
          "purpose": {
            "type": [
              "string",
              "null"
            ],
            "description": "`rfi_answer` when the file answers an open request for information.\nThe request names the file, so an `other` upload needs no\n`description`."
          }
        }
      },
      "DocumentUploadResponse": {
        "oneOf": [
          {
            "type": "object",
            "required": [
              "document",
              "type"
            ],
            "properties": {
              "document": {
                "$ref": "#/components/schemas/KycDocumentRef"
              },
              "type": {
                "type": "string",
                "enum": [
                  "individual"
                ]
              }
            }
          },
          {
            "type": "object",
            "required": [
              "document",
              "type"
            ],
            "properties": {
              "document": {
                "$ref": "#/components/schemas/KybDocumentRef"
              },
              "type": {
                "type": "string",
                "enum": [
                  "business"
                ]
              }
            }
          }
        ]
      },
      "EconomicActivity": {
        "type": "string",
        "description": "What a beneficial owner does for a living.\n\nA set rather than one answer — someone can be employed and a student at\nthe same time — so it is carried as an array and an empty one means\nunanswered.",
        "enum": [
          "employed",
          "self_employed",
          "student",
          "gambler",
          "pensioner",
          "unemployed"
        ]
      },
      "EmploymentStatus": {
        "type": "string",
        "enum": [
          "employee",
          "self_employed",
          "retired",
          "unemployed",
          "homemaker",
          "student",
          "other"
        ]
      },
      "EndUserContext": {
        "type": "object",
        "description": "Where the end user was when they accepted the terms.\n\nSupply this from a server-to-server integration, where the end user's\nbrowser never reaches us directly. All three fields are optional, and each\nis recorded as-is against the filing.",
        "properties": {
          "device_fingerprint": {
            "type": [
              "string",
              "null"
            ],
            "description": "An opaque identifier for the device they accepted on. Any printable\nencoding up to 128 characters — we record and display it, never parse\nit, so the identifier your own client library produces is fine.",
            "example": "8f14e45fceea167a5a36dedd4bea2543"
          },
          "ip_address": {
            "type": [
              "string",
              "null"
            ],
            "description": "The address the end user accepted the terms from, v4 or v6.",
            "example": "203.0.113.7"
          },
          "user_agent": {
            "type": [
              "string",
              "null"
            ],
            "description": "The user agent of the browser they accepted in: the `User-Agent`\nheader your own servers received from it, or `navigator.userAgent`.\nPrintable ASCII up to 512 characters.",
            "example": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36"
          }
        },
        "additionalProperties": false
      },
      "ErrorDetail": {
        "type": "object",
        "description": "Body of the error envelope. Some codes attach additional context\nfields alongside `code` (e.g. `violations`).",
        "required": [
          "code",
          "message"
        ],
        "properties": {
          "code": {
            "type": "string",
            "description": "Stable machine-readable code in PascalCase (e.g.\n`InvalidRequest`, `QuoteNotFound`). New codes may be added over\ntime; treat unknown codes as a generic failure at their HTTP\nstatus."
          },
          "message": {
            "type": "string",
            "description": "Human-readable description of the failure."
          },
          "related_ids": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "type": "string"
            },
            "description": "Ids of the resources this failure is about, present on the codes\nthat name them — so the resources can be linked to rather than\nread out of `message`. What they identify is fixed by `code`."
          },
          "violations": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "$ref": "#/components/schemas/Violation"
            },
            "description": "Per-field findings, present when `code` is `InvalidRequest` and\nstructured detail is available."
          }
        }
      },
      "ErrorResponse": {
        "type": "object",
        "description": "Envelope returned on every non-2xx response.",
        "required": [
          "ok",
          "error",
          "request_id"
        ],
        "properties": {
          "error": {
            "$ref": "#/components/schemas/ErrorDetail"
          },
          "ok": {
            "type": "boolean",
            "description": "Always `false` on errors."
          },
          "request_id": {
            "type": "string",
            "description": "Reference for this request, also returned as the `x-request-id`\nresponse header (e.g. `req_3f2a9c0d1b7e4f6a8c5d2e1b0a9f8e7d`).\nQuote it when contacting support."
          }
        }
      },
      "ExpiredQuoteBehavior": {
        "type": "string",
        "description": "Handling for a payment funded after its quote expired. Defaults to\n`refund_payment`; a quote's `supported_expired_quote_behaviors`\nlists the alternatives it can honor when accepted with\n`expired_quote_behavior` set.",
        "enum": [
          "refund_payment",
          "flexible_destination_amount",
          "flexible_source_amount"
        ]
      },
      "ExternalBankRail": {
        "type": "string",
        "enum": [
          "ach",
          "wire"
        ]
      },
      "ExternalFiatAccountRequirements": {
        "type": "object",
        "description": "Response body of `GET /v0/accounts/fiat/external/requirements`.",
        "required": [
          "currency",
          "bank_country",
          "account_holder_type",
          "fields"
        ],
        "properties": {
          "account_holder_type": {
            "$ref": "#/components/schemas/AccountHolderKind"
          },
          "bank_country": {
            "type": "string"
          },
          "currency": {
            "type": "string"
          },
          "fields": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/FieldRequirement"
            }
          }
        }
      },
      "FiatFundingInstructions": {
        "allOf": [
          {
            "$ref": "#/components/schemas/FiatRail"
          },
          {
            "type": "object",
            "required": [
              "currency",
              "amount"
            ],
            "properties": {
              "amount": {
                "type": "string",
                "description": "Exact amount to send, as a decimal string. It can differ from\n`source.amount` by rounding to what the rail can carry."
              },
              "currency": {
                "type": "string",
                "description": "Currency to send, as on the order's `source.currency`."
              }
            }
          }
        ],
        "description": "A fiat payment: send `amount` of `currency` over `rail`, to the details\nin `fiat`, whose shape `rail` decides."
      },
      "FiatRail": {
        "oneOf": [
          {
            "type": "object",
            "required": [
              "fiat",
              "rail"
            ],
            "properties": {
              "fiat": {
                "$ref": "#/components/schemas/UsBankAccount"
              },
              "rail": {
                "type": "string",
                "enum": [
                  "ach"
                ]
              }
            }
          },
          {
            "type": "object",
            "required": [
              "fiat",
              "rail"
            ],
            "properties": {
              "fiat": {
                "$ref": "#/components/schemas/UsBankAccount"
              },
              "rail": {
                "type": "string",
                "enum": [
                  "wire"
                ]
              }
            }
          },
          {
            "type": "object",
            "required": [
              "fiat",
              "rail"
            ],
            "properties": {
              "fiat": {
                "$ref": "#/components/schemas/SwiftAccount"
              },
              "rail": {
                "type": "string",
                "enum": [
                  "swift"
                ]
              }
            }
          },
          {
            "type": "object",
            "required": [
              "fiat",
              "rail"
            ],
            "properties": {
              "fiat": {
                "$ref": "#/components/schemas/IbanAccount"
              },
              "rail": {
                "type": "string",
                "enum": [
                  "sepa"
                ]
              }
            }
          },
          {
            "type": "object",
            "required": [
              "fiat",
              "rail"
            ],
            "properties": {
              "fiat": {
                "$ref": "#/components/schemas/IbanAccount"
              },
              "rail": {
                "type": "string",
                "enum": [
                  "npss"
                ]
              }
            }
          },
          {
            "type": "object",
            "required": [
              "fiat",
              "rail"
            ],
            "properties": {
              "fiat": {
                "$ref": "#/components/schemas/UkBankAccount"
              },
              "rail": {
                "type": "string",
                "enum": [
                  "bacs"
                ]
              }
            }
          },
          {
            "type": "object",
            "required": [
              "fiat",
              "rail"
            ],
            "properties": {
              "fiat": {
                "$ref": "#/components/schemas/UkBankAccount"
              },
              "rail": {
                "type": "string",
                "enum": [
                  "fps"
                ]
              }
            }
          },
          {
            "type": "object",
            "required": [
              "fiat",
              "rail"
            ],
            "properties": {
              "fiat": {
                "$ref": "#/components/schemas/PixCode"
              },
              "rail": {
                "type": "string",
                "enum": [
                  "pix"
                ]
              }
            }
          },
          {
            "type": "object",
            "required": [
              "fiat",
              "rail"
            ],
            "properties": {
              "fiat": {
                "$ref": "#/components/schemas/BrazilianBankAccount"
              },
              "rail": {
                "type": "string",
                "enum": [
                  "ted"
                ]
              }
            }
          },
          {
            "type": "object",
            "required": [
              "fiat",
              "rail"
            ],
            "properties": {
              "fiat": {
                "$ref": "#/components/schemas/MexicanBankAccount"
              },
              "rail": {
                "type": "string",
                "enum": [
                  "spei"
                ]
              }
            }
          },
          {
            "type": "object",
            "required": [
              "fiat",
              "rail"
            ],
            "properties": {
              "fiat": {
                "$ref": "#/components/schemas/ArgentineAccount"
              },
              "rail": {
                "type": "string",
                "enum": [
                  "coelsa"
                ]
              }
            }
          },
          {
            "type": "object",
            "required": [
              "fiat",
              "rail"
            ],
            "properties": {
              "fiat": {
                "$ref": "#/components/schemas/ArgentineAccount"
              },
              "rail": {
                "type": "string",
                "enum": [
                  "t3.0"
                ]
              }
            }
          },
          {
            "type": "object",
            "required": [
              "fiat",
              "rail"
            ],
            "properties": {
              "fiat": {
                "$ref": "#/components/schemas/PhilippineBankAccount"
              },
              "rail": {
                "type": "string",
                "enum": [
                  "instapay"
                ]
              }
            }
          },
          {
            "type": "object",
            "required": [
              "fiat",
              "rail"
            ],
            "properties": {
              "fiat": {
                "$ref": "#/components/schemas/PhilippineBankAccount"
              },
              "rail": {
                "type": "string",
                "enum": [
                  "pesonet"
                ]
              }
            }
          },
          {
            "type": "object",
            "required": [
              "fiat",
              "rail"
            ],
            "properties": {
              "fiat": {
                "$ref": "#/components/schemas/NoDetails"
              },
              "rail": {
                "type": "string",
                "enum": [
                  "nip"
                ]
              }
            }
          },
          {
            "type": "object",
            "required": [
              "fiat",
              "rail"
            ],
            "properties": {
              "fiat": {
                "$ref": "#/components/schemas/PaymentLink"
              },
              "rail": {
                "type": "string",
                "enum": [
                  "pse"
                ]
              }
            }
          }
        ],
        "description": "The rail to send over, as on the order's `source.rail`, and the details\nit is paid with."
      },
      "FiatShape": {
        "type": "string",
        "description": "Family of bank identifiers a fiat account uses — determines the\nlayout of its `details` block. Some variants are declared ahead of\ntheir corridor opening; creates for those are rejected today.",
        "enum": [
          "us",
          "uk",
          "iban",
          "swift",
          "br_pix",
          "br_bank",
          "mx_clabe",
          "in_ifsc",
          "au_bsb",
          "ca_eft",
          "jp_zengin",
          "ar_cbu",
          "co_bank",
          "cl_bank",
          "pe_cci",
          "cn_cnaps",
          "hk_fps",
          "sg_fast",
          "ph_bank",
          "pk_iban",
          "ng_bank",
          "thb_bank",
          "idr_bank"
        ]
      },
      "FieldCondition": {
        "type": "object",
        "description": "Holds when the request's value at `field` is one of `in`.",
        "required": [
          "field",
          "in"
        ],
        "properties": {
          "field": {
            "type": "string",
            "description": "Dotted request path of the field the condition reads, e.g.\n`account_holder.address.country`."
          },
          "in": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Values of `field` that make the field required. Country codes are\nISO 3166-1 alpha-2."
          }
        }
      },
      "FieldOption": {
        "type": "object",
        "description": "Allowed value for an enumerated field (e.g. a bank list, or\naccount-type choices).",
        "required": [
          "value"
        ],
        "properties": {
          "label": {
            "type": [
              "string",
              "null"
            ]
          },
          "value": {
            "type": "string"
          }
        }
      },
      "FieldRequirement": {
        "type": "object",
        "description": "One field needed to register an external fiat account (payout\ndestination), named by its dotted request path (e.g.\n`details.account_number`, `account_holder.address.city`).",
        "required": [
          "field",
          "requirement"
        ],
        "properties": {
          "accepted_for_rails": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Rails that accept this field, present only when some candidate rails\ndo not: a request that settles over any other rail is rejected if it\nsends the field. Absent when every rail of the corridor accepts it."
          },
          "example": {
            "type": [
              "string",
              "null"
            ]
          },
          "field": {
            "type": "string"
          },
          "label": {
            "type": [
              "string",
              "null"
            ]
          },
          "max_length": {
            "type": [
              "integer",
              "null"
            ],
            "format": "int32",
            "minimum": 0
          },
          "options": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "$ref": "#/components/schemas/FieldOption"
            }
          },
          "regex": {
            "type": [
              "string",
              "null"
            ]
          },
          "required_for_rails": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Rails that escalate this field to required. Present only on\n`optional` fields — e.g. a wire-only identifier is optional for a\ncorridor reachable by other rails, but required once the account\nsettles over that rail. A `required` field is needed regardless of\nrail, so it never carries this list."
          },
          "required_when": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/FieldCondition"
            },
            "description": "Conditions on other fields of the same request, any one of which\nmakes this field required — e.g. a phone number required when the\nholder's address is in one of a list of countries. Present only on\n`optional` fields, like `required_for_rails`."
          },
          "requirement": {
            "$ref": "#/components/schemas/RequirementLevel"
          }
        }
      },
      "FundingInstructions": {
        "oneOf": [
          {
            "allOf": [
              {
                "$ref": "#/components/schemas/FiatFundingInstructions"
              },
              {
                "type": "object",
                "required": [
                  "type"
                ],
                "properties": {
                  "type": {
                    "type": "string",
                    "enum": [
                      "fiat"
                    ]
                  }
                }
              }
            ]
          },
          {
            "allOf": [
              {
                "$ref": "#/components/schemas/CryptoFundingInstructions"
              },
              {
                "type": "object",
                "required": [
                  "type"
                ],
                "properties": {
                  "type": {
                    "type": "string",
                    "enum": [
                      "crypto"
                    ]
                  }
                }
              }
            ]
          }
        ],
        "description": "How to fund an order that waits for the payer's money. `type` says\nwhether it is a `fiat` or a `crypto` payment, and `rail` decides exactly\nwhich details come with it."
      },
      "Gender": {
        "type": "string",
        "description": "Gender of an individual, as recorded on their government identification.\n\nOptional today. Seismic requires it before provisioning a virtual account\nin some currencies, and asks it of every beneficial owner of a business,\nnot only of the account holder.",
        "enum": [
          "male",
          "female"
        ]
      },
      "GovIdKind": {
        "type": "string",
        "enum": [
          "passport",
          "drivers_license",
          "national_id",
          "residence_permit",
          "voters_card",
          "other"
        ]
      },
      "GovernmentIdentification": {
        "type": "object",
        "properties": {
          "back_image_document_id": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid",
            "description": "Document id of the back-of-card scan. Often absent for\npassports."
          },
          "country": {
            "type": [
              "string",
              "null"
            ],
            "description": "Issuing country (ISO-3166-1 alpha-2).",
            "maxLength": 2,
            "minLength": 2
          },
          "expiration_date": {
            "type": [
              "string",
              "null"
            ],
            "format": "date",
            "description": "Date the document expires (`YYYY-MM-DD`). Optional in general, but\nrequired by some jurisdictions before an account can be opened —\nnotably AED."
          },
          "front_image_document_id": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid",
            "description": "Document id of the front-of-card scan, from the documents\nupload endpoint."
          },
          "issuance_date": {
            "type": [
              "string",
              "null"
            ],
            "format": "date",
            "description": "Date the document was issued (`YYYY-MM-DD`). Optional."
          },
          "kind": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "$ref": "#/components/schemas/GovIdKind"
              }
            ]
          },
          "number": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 64
          }
        }
      },
      "HolderRelationship": {
        "type": "string",
        "description": "Who an external account's holder is to the customer, as a\nfour-letter code. The set accepted depends on the holder's `type`.",
        "enum": [
          "PART",
          "CHIL",
          "SPOU",
          "CUST",
          "EMPL",
          "EXSP",
          "FREN",
          "CONT",
          "LAND",
          "OTHR",
          "PARE",
          "RELA",
          "SELF",
          "SIBL",
          "VEND",
          "BRAN",
          "FRAN",
          "HOLD",
          "SUBS",
          "SUPP"
        ]
      },
      "HostedKycLink": {
        "type": "object",
        "description": "Hosted KYC link surfaced inline on every customer payload. The\npartner emails `url` to their customer; the customer clicks through\nto the standalone `/kyc-link/<token>` page and fills in the hosted\nverification form. `token` is the same plaintext embedded in the\nURL — exposed so partners can build their own URLs against a\ndifferent frontend host.\n\nRotation: `POST /v0/customers/:id/kyc-link/rotate` overwrites the\ntoken in place and returns the new pair. There is no expiry or\nrevocation.",
        "required": [
          "token",
          "url"
        ],
        "properties": {
          "token": {
            "type": "string"
          },
          "url": {
            "type": "string",
            "description": "Absolute URL the partner emails to their customer — origin +\noptional base path + `/kyc-link/<kind>/<token>`. The origin is\nSeismic's hosted origin for the environment\n(`https://orchestration.seismic.systems` in production,\n`https://orchestration.seismictest.net` in sandbox). Partners\nembedding the link in their own branded frontend can ignore this\nand rebuild the URL against their own host using `token`."
          }
        }
      },
      "IbanAccount": {
        "allOf": [
          {
            "$ref": "#/components/schemas/Payee"
          },
          {
            "type": "object",
            "required": [
              "iban"
            ],
            "properties": {
              "bic": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "BIC / SWIFT code of the receiving bank."
              },
              "iban": {
                "type": "string"
              }
            }
          }
        ],
        "description": "`sepa`, `npss`."
      },
      "IdOrName": {
        "oneOf": [
          {
            "type": "integer",
            "format": "int32"
          },
          {
            "type": "string"
          }
        ],
        "description": "Reference to a currency or rail by either its stable numeric id or\nits human-readable name (`\"USDC\"`, `\"ethereum\"`). Used on the\ncreate-account request bodies for `currency`, for the external\nfiat `rails`, and for a crypto account's `rail`."
      },
      "KyHighRiskActivity": {
        "type": "string",
        "enum": [
          "adult_entertainment",
          "gambling",
          "marijuana",
          "drugs",
          "firearms",
          "crypto_mixing",
          "money_services",
          "lending_or_banking",
          "foreign_exchange",
          "hold_client_funds",
          "investment_services",
          "safe_deposit_box",
          "tobacco",
          "pharmaceuticals",
          "third_party_payment_processing",
          "none_of_the_above"
        ]
      },
      "KyStatus": {
        "type": "string",
        "enum": [
          "draft",
          "submitted",
          "under_review",
          "action_required",
          "approved",
          "rejected",
          "terminally_rejected",
          "paused",
          "unknown"
        ]
      },
      "KybAssociatedPersonRole": {
        "type": "string",
        "enum": [
          "beneficial_owner",
          "control_person",
          "officer",
          "director",
          "authorized_signer"
        ]
      },
      "KybDocumentRef": {
        "type": "object",
        "description": "Metadata-rich document reference returned by the customer documents\nendpoints for businesses.",
        "required": [
          "document_id",
          "kind",
          "filename",
          "content_type",
          "size_bytes",
          "uploaded_at"
        ],
        "properties": {
          "content_type": {
            "type": "string"
          },
          "deleted_at": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time",
            "description": "When the document was soft-deleted, if it has been. Only ever populated\non the internal admin documents view; the partner list omits\nsoft-deleted documents entirely, so this is always absent there."
          },
          "description": {
            "type": [
              "string",
              "null"
            ],
            "description": "User-supplied label; only ever set for multi-instance `other` docs."
          },
          "document_id": {
            "type": "string",
            "format": "uuid"
          },
          "filename": {
            "type": "string"
          },
          "kind": {
            "$ref": "#/components/schemas/DocumentKind"
          },
          "proof_of_address_type": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "$ref": "#/components/schemas/ProofOfAddressType",
                "description": "What a `proof_of_address` is, as declared at upload. Absent on every\nother kind, and on a proof of address uploaded without one."
              }
            ]
          },
          "size_bytes": {
            "type": "integer",
            "format": "int64"
          },
          "uploaded_at": {
            "type": "string",
            "format": "date-time"
          }
        }
      },
      "KybEntityType": {
        "type": "string",
        "enum": [
          "sole_proprietorship",
          "llc",
          "s_corporation",
          "c_corporation",
          "b_corporation",
          "non_profit",
          "partnership",
          "limited_partnership",
          "limited_liability_partnership",
          "trust",
          "dao",
          "cooperative",
          "other"
        ]
      },
      "KybLink": {
        "type": "object",
        "description": "Hosted verification link for the business to complete KYB.",
        "required": [
          "url"
        ],
        "properties": {
          "expires_at": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          },
          "url": {
            "type": "string"
          }
        }
      },
      "KybProfile": {
        "type": "object",
        "properties": {
          "addresses": {
            "$ref": "#/components/schemas/KybProfileAddresses"
          },
          "associated_persons": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/AssociatedPerson"
            }
          },
          "attestations": {
            "$ref": "#/components/schemas/KybProfileAttestations"
          },
          "business": {
            "$ref": "#/components/schemas/KybProfileBusiness"
          },
          "contact": {
            "$ref": "#/components/schemas/KybProfileContact"
          },
          "counterparties": {
            "$ref": "#/components/schemas/KybProfileCounterparties"
          },
          "documents": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/KybDocumentRef"
            }
          },
          "operations": {
            "$ref": "#/components/schemas/KybProfileOperations"
          },
          "supplemental": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SupplementalEntry"
            },
            "description": "Supplemental-information entries: free-form text notes and document\nattachments for anything that doesn't fit the rest of the form.\nOmitted while empty."
          },
          "volumes": {
            "$ref": "#/components/schemas/KybProfileVolumes"
          }
        }
      },
      "KybProfileAddresses": {
        "type": "object",
        "properties": {
          "operating_is_remote": {
            "type": "boolean",
            "description": "The business operates remotely, so the address it operates from is the\nresidential address of a control person rather than an office. Setting\nit adds a statement to that effect to the supplemental information\ndocument compliance review reads. A `physical` address sent alongside it must match the\naddress of one of the profile's beneficial owners, and the rule runs the\nother way too: an operating address that is a beneficial owner's\nresidence requires this flag. `physical` itself stays optional — the\nresidence may be the registered address the profile already carries."
          },
          "physical": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "$ref": "#/components/schemas/OperatingAddress"
              }
            ]
          },
          "registered": {
            "$ref": "#/components/schemas/Address"
          }
        }
      },
      "KybProfileAttestations": {
        "type": "object",
        "description": "Submission-time attestations. Both must be `true` at submit.",
        "properties": {
          "information_attested": {
            "type": "boolean"
          },
          "terms_and_conditions_accepted": {
            "type": "boolean"
          }
        }
      },
      "KybProfileBusiness": {
        "type": "object",
        "properties": {
          "corporate_entity_type_description": {
            "type": [
              "string",
              "null"
            ],
            "description": "Required when `entity_type == Other`."
          },
          "country_of_registration": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 2,
            "minLength": 2
          },
          "description": {
            "type": [
              "string",
              "null"
            ],
            "description": "What the business does, who its customers are, how it makes money, and\nhow funds move through it. At least 350 characters at submit, and from\n2026-11-01 at most 1,000."
          },
          "entity_type": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "$ref": "#/components/schemas/KybEntityType"
              }
            ]
          },
          "formation_date": {
            "type": [
              "string",
              "null"
            ],
            "format": "date"
          },
          "industry": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 256
          },
          "is_dao": {
            "type": "boolean"
          },
          "legal_name": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 256
          },
          "marketing_strategy": {
            "type": [
              "string",
              "null"
            ],
            "description": "How the entity markets themselves to generate business. Required when\nthe entity has no website, and dropped on save when a website is given."
          },
          "no_website": {
            "type": "boolean",
            "description": "The entity has no public-facing website. Setting it clears `website`\nand makes `marketing_strategy`, `website_eta`, and\n`social_media_profile` required."
          },
          "pre_revenue": {
            "type": "boolean",
            "description": "The entity has no revenue yet, so its proof of nature of business is\nalternative documentation of its preparations to operate rather than\ninvoices or executed agreements. Setting it adds a statement to that\neffect to the supplemental information document compliance review\nreads."
          },
          "publicly_traded": {
            "type": "boolean",
            "description": "The entity's shares trade on a public exchange. Listed entities carry\ndisclosure obligations that change what verification is required of\nthem, so compliance review needs the answer stated rather than\nassumed. Defaults to `false`, which is what an entity that has never\nbeen asked submits."
          },
          "registration_number": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 64
          },
          "social_media_profile": {
            "type": [
              "string",
              "null"
            ],
            "description": "A social media profile URL for the entity, or for one of its\nbeneficial owners, standing in for the website it does not have.\nRequired when the entity has no website, and dropped on save when a\nwebsite is given.",
            "maxLength": 128
          },
          "state_of_incorporation": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 2,
            "minLength": 2
          },
          "target_customers_description": {
            "type": [
              "string",
              "null"
            ],
            "description": "Who the entity's customers are, in the detail compliance review needs:\nwhether they are individuals or businesses, where they are located,\ntheir top personas, their financial motivation for opening an account,\nand how they use it in practice. Required at submit on your own\norganization's KYB, and included in the supplemental information\ndocument compliance review reads."
          },
          "tax_id": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 64
          },
          "trade_name": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 256
          },
          "transliterated_legal_name": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 256
          },
          "transliterated_trade_name": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 256
          },
          "website": {
            "type": [
              "string",
              "null"
            ],
            "description": "Public-facing URL. Optional — omit it when the entity has no public\nwebsite, in which case `marketing_strategy`, `website_eta`, and\n`social_media_profile` are required instead.",
            "maxLength": 2048
          },
          "website_eta": {
            "type": [
              "string",
              "null"
            ],
            "description": "When the entity expects to publish a website: an ISO-8601 date in\nthe future, or `0000-00-00` when it does not intend to have one.\nRequired when the entity has no website, and dropped on save when a\nwebsite is given.",
            "example": "2027-03-01"
          }
        }
      },
      "KybProfileContact": {
        "type": "object",
        "properties": {
          "email": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 254
          },
          "phone": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 32
          },
          "phone_country_code": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 8
          }
        }
      },
      "KybProfileCounterparties": {
        "type": "object",
        "properties": {
          "counterparties": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/CounterpartyType"
            }
          }
        }
      },
      "KybProfileOperations": {
        "type": "object",
        "properties": {
          "account_purpose": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "$ref": "#/components/schemas/AccountPurpose"
              }
            ]
          },
          "account_purpose_explanation": {
            "type": [
              "string",
              "null"
            ],
            "description": "How the business will use its accounts. Required when `account_purpose`\nor `primary_source_of_funds` is `other`, and from 2026-11-14 whatever\nthe purpose. From 2026-11-01, 200 to 1,000 characters when given."
          },
          "acting_as_intermediary": {
            "type": "boolean",
            "description": "Whether this entity sits between any payer and payee. This includes\nmarketplaces and fintech companies, even non-custodial ones that are\nnot in the flow of funds. Defaults to `false`."
          },
          "business_classifications": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/BusinessClassification"
            },
            "description": "How the business positions itself between payers and payees. Selecting\n`marketplace` or `financial_services_provider` implies\n`acting_as_intermediary`, and requires a `flow_of_funds` and a\n`licensed_vendors_attestation` document at submit. Required at submit\nfrom 2026-09-14: send `[\"none_of_the_above\"]` when none apply. The\norganization's own profile always includes\n`financial_services_provider`, whatever is sent."
          },
          "business_jurisdictions": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "compliance_screening_explanation": {
            "type": [
              "string",
              "null"
            ],
            "description": "The combined screening narrative sent to compliance. Set it directly to\nsupply the whole thing, or answer\n`msb_compliance_screening_description` /\n`high_risk_activities_description` and it is assembled from those.\nFrom 2026-11-01, the assembled narrative, section headers included, may\nbe at most 1,000 characters."
          },
          "funds_movement_jurisdictions": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "has_complex_ownership": {
            "type": "boolean",
            "description": "Set true when the business has UBOs requiring beneficial-owner\ndisclosure (typically at least one `beneficial_owner` role in\n`associated_persons`)."
          },
          "high_risk_activities": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/KyHighRiskActivity"
            },
            "description": "The high-risk activities the business is involved in. Required at\nsubmit from 2026-09-14: send `[\"none_of_the_above\"]` when none apply,\nso an unanswered disclosure is never mistaken for a negative one."
          },
          "high_risk_activities_description": {
            "type": [
              "string",
              "null"
            ],
            "description": "The business's involvement in the verticals it disclosed. Required when\n`high_risk_activities` names a real vertical."
          },
          "in_flow_of_funds": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Whether the entity will at any point receive, hold, control, convert,\nor transmit customer funds, fiat or digital. Asked of marketplaces and\nfinancial services providers, and included in the supplemental\ninformation document compliance review reads. Required at submit for\nmarketplaces and financial services providers, which includes every\norganization; `false` is an answer. From 2026-11-01, `true` requires\n`registered_msb_description` and `msb_compliance_screening_description`."
          },
          "licensed_vendors": {
            "type": "boolean",
            "description": "The entity relies on licensed / regulated vendors as a core part of\nits business. When true, an attested list of those vendors is a\nrequired document at submit (`documents.licensed_vendors_attestation`).\nAlways `true` on the organization's own profile, whatever is sent."
          },
          "msb_compliance_screening_description": {
            "type": [
              "string",
              "null"
            ],
            "description": "The compliance screening program behind the business's money services.\nRequired when `registered_msb` is `true`. From 2026-11-01, also required\nwhen `in_flow_of_funds` is `true`, and at least 200 characters."
          },
          "operates_in_prohibited_countries": {
            "type": "boolean"
          },
          "primary_source_of_funds": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "$ref": "#/components/schemas/SourceOfFunds"
              }
            ]
          },
          "primary_source_of_funds_description": {
            "type": [
              "string",
              "null"
            ],
            "description": "Detail on the business's historical source of funds. Required at\nsubmit whatever `primary_source_of_funds` is; from 2026-11-01, 200 to\n1,000 characters."
          },
          "registered_msb": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Whether the business is registered as a money services business in any\ncountry. On a business customer, omitting it means `false`. On the\norganization's own profile it is a required yes/no answer at submit\nfrom 2026-11-01, and `false` is an answer."
          },
          "registered_msb_description": {
            "type": [
              "string",
              "null"
            ],
            "description": "The money services the business provides. Required when\n`registered_msb` is `true`, and from 2026-11-01 also when\n`in_flow_of_funds` is `true`."
          },
          "regulated_activity_description": {
            "type": [
              "string",
              "null"
            ],
            "description": "Free-text describing the licensed activity. All four\n`regulated_*` fields are absent together when the business does\nnot conduct regulated activities, and set together when it\ndoes."
          },
          "regulated_authority_country": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 2,
            "minLength": 2
          },
          "regulated_authority_name": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 256
          },
          "regulated_license_number": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 64
          },
          "regulated_status": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "$ref": "#/components/schemas/RegulatedStatus"
              }
            ]
          },
          "source_of_wealth": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "$ref": "#/components/schemas/SourceOfFunds",
                "description": "Where the business's overall wealth came from — the net-worth\nquestion, as opposed to `primary_source_of_funds`, its historical\nsource of funds: where its funds have come from to date. Shares the\nsource-of-funds options. Optional."
              }
            ]
          }
        }
      },
      "KybProfileVolumes": {
        "type": "object",
        "description": "Expected activity volumes. Counts and USD values are whole\nintegers — coarse estimates are fine.",
        "properties": {
          "estimated_annual_revenue_usd": {
            "type": [
              "integer",
              "null"
            ],
            "format": "int64",
            "description": "Annual revenue, whole dollars."
          },
          "expected_monthly_payments_usd": {
            "type": [
              "integer",
              "null"
            ],
            "format": "int64",
            "description": "Expected monthly USD payments, whole dollars. Defaults to\n`usd_value_of_fiat` when omitted."
          },
          "monthly_crypto_deposits": {
            "type": [
              "integer",
              "null"
            ],
            "format": "int64",
            "minimum": 0
          },
          "monthly_crypto_investment_deposit_usd": {
            "type": [
              "integer",
              "null"
            ],
            "format": "int64"
          },
          "monthly_crypto_investment_withdrawal_usd": {
            "type": [
              "integer",
              "null"
            ],
            "format": "int64"
          },
          "monthly_crypto_withdrawals": {
            "type": [
              "integer",
              "null"
            ],
            "format": "int64",
            "minimum": 0
          },
          "monthly_deposits": {
            "type": [
              "integer",
              "null"
            ],
            "format": "int64",
            "description": "Monthly fiat deposit count.",
            "minimum": 0
          },
          "monthly_investment_deposit_usd": {
            "type": [
              "integer",
              "null"
            ],
            "format": "int64",
            "description": "Monthly investment deposit value in whole USD."
          },
          "monthly_investment_withdrawal_usd": {
            "type": [
              "integer",
              "null"
            ],
            "format": "int64"
          },
          "monthly_withdrawals": {
            "type": [
              "integer",
              "null"
            ],
            "format": "int64",
            "minimum": 0
          },
          "usd_value_of_crypto": {
            "type": [
              "integer",
              "null"
            ],
            "format": "int64",
            "description": "Monthly expected crypto activity in whole USD."
          },
          "usd_value_of_fiat": {
            "type": [
              "integer",
              "null"
            ],
            "format": "int64",
            "description": "Monthly expected fiat activity in whole USD."
          }
        }
      },
      "KybState": {
        "type": "object",
        "description": "Rolled-up KYB verification state for a business customer.",
        "required": [
          "kyb_status",
          "missing_fields",
          "last_synced_at"
        ],
        "properties": {
          "kyb_link": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "$ref": "#/components/schemas/KybLink",
                "description": "Always `null`. Verification is completed through the hosted link on\nthe customer envelope."
              }
            ]
          },
          "kyb_status": {
            "$ref": "#/components/schemas/KyStatus"
          },
          "last_submitted_at": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time",
            "description": "When the profile was last filed for verification, or `null` if it\nnever has been. Moves on every submission that reaches verification,\nso a resubmission is visible even though the status it lands in is\nthe same one it left."
          },
          "last_synced_at": {
            "type": "string",
            "format": "date-time"
          },
          "missing_fields": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "pending_rfi": {
            "type": "boolean",
            "description": "`true` while an open request for information is outstanding on this\nverification. Raised by Seismic compliance and independent of the\nstatus, so it can be `true` at any status; answering every open item\nclears it. Resubmitting the profile does not."
          },
          "rejection_reason": {
            "type": [
              "string",
              "null"
            ]
          },
          "resubmit_available": {
            "type": "boolean",
            "description": "Whether submitting again would re-file part of this verification for\nreview. `false` before the first submission."
          }
        }
      },
      "KycDocumentRef": {
        "type": "object",
        "description": "Metadata-rich document reference returned by the customer documents\nendpoints for individuals.",
        "required": [
          "kind",
          "document_id",
          "filename",
          "content_type",
          "size_bytes",
          "uploaded_at"
        ],
        "properties": {
          "content_type": {
            "type": "string"
          },
          "deleted_at": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time",
            "description": "When the document was soft-deleted, if it has been. Only ever populated\non the internal admin documents view; the partner list omits\nsoft-deleted documents entirely, so this is always absent there."
          },
          "description": {
            "type": [
              "string",
              "null"
            ],
            "description": "User-supplied label; only ever set for multi-instance `other` docs."
          },
          "document_id": {
            "type": "string",
            "format": "uuid"
          },
          "filename": {
            "type": "string"
          },
          "kind": {
            "type": "string"
          },
          "proof_of_address_type": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "$ref": "#/components/schemas/ProofOfAddressType",
                "description": "What a `proof_of_address` is, as declared at upload. Absent on every\nother kind, and on a proof of address uploaded without one."
              }
            ]
          },
          "size_bytes": {
            "type": "integer",
            "format": "int64"
          },
          "uploaded_at": {
            "type": "string",
            "format": "date-time"
          }
        }
      },
      "KycLink": {
        "type": "object",
        "description": "Hosted verification link for the customer to complete KYC.",
        "required": [
          "url"
        ],
        "properties": {
          "expires_at": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          },
          "url": {
            "type": "string"
          }
        }
      },
      "KycProfile": {
        "type": "object",
        "properties": {
          "addresses": {
            "$ref": "#/components/schemas/KycProfileAddresses"
          },
          "attestations": {
            "$ref": "#/components/schemas/KycProfileAttestations"
          },
          "contact": {
            "$ref": "#/components/schemas/KycProfileContact"
          },
          "documents": {
            "$ref": "#/components/schemas/KycProfileDocuments"
          },
          "employment": {
            "$ref": "#/components/schemas/KycProfileEmployment"
          },
          "identity": {
            "$ref": "#/components/schemas/KycProfileIdentity"
          },
          "jurisdictions": {
            "$ref": "#/components/schemas/KycProfileJurisdictions"
          },
          "risk": {
            "$ref": "#/components/schemas/KycProfileRisk"
          },
          "supplemental": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SupplementalEntry"
            },
            "description": "Supplemental-information entries: free-form text notes and document\nattachments for anything that doesn't fit the rest of the form.\nOmitted while empty."
          },
          "volumes": {
            "$ref": "#/components/schemas/KycProfileVolumes"
          }
        }
      },
      "KycProfileAddresses": {
        "type": "object",
        "properties": {
          "mailing": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "$ref": "#/components/schemas/Address",
                "description": "Optional separate mailing address."
              }
            ]
          },
          "residential": {
            "$ref": "#/components/schemas/Address",
            "description": "Where the customer lives."
          }
        }
      },
      "KycProfileAttestations": {
        "type": "object",
        "properties": {
          "information_attested": {
            "type": "boolean"
          },
          "terms_and_conditions_accepted": {
            "type": "boolean",
            "description": "Both must be `true` at submit."
          }
        }
      },
      "KycProfileContact": {
        "type": "object",
        "properties": {
          "email": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 254
          },
          "phone": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 32
          },
          "phone_country_code": {
            "type": [
              "string",
              "null"
            ],
            "description": "ISO-3166-1 alpha-2 code of the country whose dialing code is on\n`phone`. Required at submit.",
            "maxLength": 8
          }
        }
      },
      "KycProfileDocuments": {
        "type": "object",
        "properties": {
          "government_issued_identification": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "$ref": "#/components/schemas/GovernmentIdentification",
                "description": "Government-issued ID metadata plus image document references.\nRequired at submit unless the customer completes the hosted\nverification form instead."
              }
            ]
          },
          "supporting_documents": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SupportingDocumentRef"
            },
            "description": "Free-form supporting documents (bank statements, proof of\naddress, etc.), each referencing an uploaded document by id.\nRead-only: this list is derived from the documents attached via the\ndocument endpoints and is ignored on write — manage it through\n`POST`/`DELETE /v0/customers/{id}/kyc/documents`, not the profile."
          }
        }
      },
      "KycProfileEmployment": {
        "type": "object",
        "properties": {
          "employer_name": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 256
          },
          "employment_description": {
            "type": [
              "string",
              "null"
            ],
            "description": "Required when `employment_status == Other`."
          },
          "employment_status": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "$ref": "#/components/schemas/EmploymentStatus"
              }
            ]
          },
          "occupation_soc": {
            "type": [
              "string",
              "null"
            ],
            "description": "The individual's occupation, as a 6-digit SOC code (`NN-NNNN`) from\nthe catalog served by `GET /v0/soc-codes`. Required at submit.",
            "maxLength": 7
          }
        }
      },
      "KycProfileIdentity": {
        "type": "object",
        "properties": {
          "citizenship": {
            "type": [
              "string",
              "null"
            ],
            "description": "Citizenship (ISO-3166-1 alpha-2).",
            "maxLength": 2,
            "minLength": 2
          },
          "country_of_birth": {
            "type": [
              "string",
              "null"
            ],
            "description": "Country of birth (ISO-3166-1 alpha-2). Distinct from `nationality`\nand `citizenship` — a person can be born somewhere they hold neither.",
            "maxLength": 2,
            "minLength": 2
          },
          "country_of_residence": {
            "type": [
              "string",
              "null"
            ],
            "description": "Where the user actually lives (ISO-3166-1 alpha-2). Often equal to\n`nationality`.",
            "maxLength": 2,
            "minLength": 2
          },
          "date_of_birth": {
            "type": [
              "string",
              "null"
            ],
            "format": "date"
          },
          "first_name": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 128
          },
          "gender": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "$ref": "#/components/schemas/Gender"
              }
            ]
          },
          "last_name": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 128
          },
          "middle_name": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 128
          },
          "nationality": {
            "type": [
              "string",
              "null"
            ],
            "description": "Passport country (ISO-3166-1 alpha-2).",
            "maxLength": 2,
            "minLength": 2
          },
          "social_profile_url": {
            "type": [
              "string",
              "null"
            ],
            "description": "Link to the customer's profile on LinkedIn, Facebook, Instagram or X.\nOptional; when present it must be an http(s) link to one of those\nnetworks. Corroborates the identity on the government ID during\nreview.",
            "maxLength": 256
          },
          "tax_identification_number": {
            "type": [
              "string",
              "null"
            ],
            "description": "Tax ID / SSN. Required for US residents.",
            "maxLength": 64
          },
          "transliterated_first_name": {
            "type": [
              "string",
              "null"
            ],
            "description": "Latin-1 transliterations, required when the matching canonical\nname contains non-Latin-1 characters.",
            "maxLength": 128
          },
          "transliterated_last_name": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 128
          },
          "transliterated_middle_name": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 128
          }
        }
      },
      "KycProfileJurisdictions": {
        "type": "object",
        "properties": {
          "funds_send_receive_jurisdictions": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Countries the user expects to send / receive funds to-from\n(ISO-3166-1 alpha-2)."
          },
          "high_risk_activities": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/KyHighRiskActivity"
            },
            "description": "High-risk activities the user engages in. Required at submit from\n2026-09-14: send `[\"none_of_the_above\"]` when none apply, so an\nunanswered disclosure is never mistaken for a negative one."
          },
          "vendors_and_counterparties": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/CounterpartyType"
            }
          }
        }
      },
      "KycProfileRisk": {
        "type": "object",
        "properties": {
          "account_purpose": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "$ref": "#/components/schemas/AccountPurpose"
              }
            ]
          },
          "account_purpose_explanation": {
            "type": [
              "string",
              "null"
            ],
            "description": "Required when `account_purpose == Other`."
          },
          "acting_as_intermediary": {
            "type": "boolean",
            "description": "Whether this entity sits between any payer and payee. This includes\nmarketplaces and fintech companies, even non-custodial ones that are\nnot in the flow of funds. Defaults to `false`."
          },
          "pep_status": {
            "type": "boolean",
            "description": "Self-attested PEP (Politically Exposed Person) flag."
          },
          "primary_source_of_funds": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "$ref": "#/components/schemas/SourceOfFunds"
              }
            ]
          },
          "primary_source_of_funds_description": {
            "type": [
              "string",
              "null"
            ],
            "description": "Required when `primary_source_of_funds == Other`."
          },
          "source_of_wealth": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "$ref": "#/components/schemas/SourceOfFunds",
                "description": "Primary source of the individual's overall wealth — where the net\nworth came from, as opposed to where the funds moving through the\naccount come from. Takes the same options as\n`primary_source_of_funds`. Required at submit."
              }
            ]
          }
        }
      },
      "KycProfileVolumes": {
        "type": "object",
        "description": "Expected activity volumes. Counts and USD values are whole\nintegers — coarse estimates are fine.",
        "properties": {
          "expected_monthly_payments_usd": {
            "type": [
              "integer",
              "null"
            ],
            "format": "int64",
            "description": "Expected monthly USD payments, whole dollars."
          },
          "monthly_crypto_deposits": {
            "type": [
              "integer",
              "null"
            ],
            "format": "int32",
            "minimum": 0
          },
          "monthly_crypto_investment_deposit_usd": {
            "type": [
              "integer",
              "null"
            ],
            "format": "int64"
          },
          "monthly_crypto_investment_withdrawal_usd": {
            "type": [
              "integer",
              "null"
            ],
            "format": "int64"
          },
          "monthly_crypto_withdrawals": {
            "type": [
              "integer",
              "null"
            ],
            "format": "int32",
            "minimum": 0
          },
          "monthly_deposits": {
            "type": [
              "integer",
              "null"
            ],
            "format": "int32",
            "description": "Monthly fiat deposit count.",
            "minimum": 0
          },
          "monthly_investment_deposit_usd": {
            "type": [
              "integer",
              "null"
            ],
            "format": "int64",
            "description": "Monthly investment deposit value in whole USD."
          },
          "monthly_investment_withdrawal_usd": {
            "type": [
              "integer",
              "null"
            ],
            "format": "int64"
          },
          "monthly_withdrawals": {
            "type": [
              "integer",
              "null"
            ],
            "format": "int32",
            "minimum": 0
          },
          "usd_value_of_crypto": {
            "type": [
              "integer",
              "null"
            ],
            "format": "int64",
            "description": "Monthly crypto activity in whole USD."
          },
          "usd_value_of_fiat": {
            "type": [
              "integer",
              "null"
            ],
            "format": "int64",
            "description": "Monthly fiat activity in whole USD."
          }
        }
      },
      "KycState": {
        "type": "object",
        "description": "Rolled-up KYC verification state for an individual customer.",
        "required": [
          "kyc_status",
          "missing_fields",
          "last_synced_at"
        ],
        "properties": {
          "kyc_link": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "$ref": "#/components/schemas/KycLink",
                "description": "Always `null`. Verification is completed through the hosted link on\nthe customer envelope."
              }
            ]
          },
          "kyc_status": {
            "$ref": "#/components/schemas/KyStatus"
          },
          "last_submitted_at": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time",
            "description": "When the profile was last filed for verification, or `null` if it\nnever has been. Moves on every submission that reaches verification,\nso a resubmission is visible even though the status it lands in is\nthe same one it left."
          },
          "last_synced_at": {
            "type": "string",
            "format": "date-time"
          },
          "missing_fields": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "pending_rfi": {
            "type": "boolean",
            "description": "`true` while an open request for information is outstanding on this\nverification. Raised by Seismic compliance and independent of the\nstatus, so it can be `true` at any status; answering every open item\nclears it. Resubmitting the profile does not."
          },
          "rejection_reason": {
            "type": [
              "string",
              "null"
            ]
          },
          "resubmit_available": {
            "type": "boolean",
            "description": "Whether submitting again would re-file part of this verification for\nreview. `false` before the first submission."
          }
        }
      },
      "Leg": {
        "type": "object",
        "description": "Resolved leg of a trade — one side, fully materialized. Returned\ninside a quote's `in` / `out`.\n\n`account_id` is always present. A nil UUID means no\nsettlement-ready account backs this leg yet — re-quote with\nregistered accounts before accepting.",
        "required": [
          "amount",
          "currency",
          "rail",
          "account_id"
        ],
        "properties": {
          "account_id": {
            "type": "string",
            "format": "uuid"
          },
          "address": {
            "type": [
              "string",
              "null"
            ]
          },
          "amount": {
            "type": "string"
          },
          "currency": {
            "type": "string"
          },
          "rail": {
            "type": "string"
          }
        }
      },
      "LegMinAmount": {
        "type": "object",
        "description": "One leg's minimum, as decimal strings; a quote must clear every amount\npresent. Fields without a minimum are omitted.",
        "properties": {
          "native": {
            "type": [
              "string",
              "null"
            ],
            "description": "In the pair's own currency, compared with the amount received\nwithout converting it. Only a `destination` leg carries one."
          },
          "usd": {
            "type": [
              "string",
              "null"
            ],
            "description": "Valued in USD, compared with the amount received after fees."
          }
        }
      },
      "LegRequest": {
        "oneOf": [
          {
            "type": "string",
            "format": "uuid",
            "description": "Bare account id — shorthand for `{ \"account\": \"<id>\" }`. Only valid when the account supports exactly one currency and one rail."
          },
          {
            "type": "object",
            "description": "Account reference with optional disambiguation, or an inline corridor descriptor. At least one of `account` or `currency` must be set.",
            "properties": {
              "account": {
                "type": "string",
                "format": "uuid",
                "description": "Id of a registered account."
              },
              "address": {
                "type": "string",
                "description": "Inline crypto address, for pricing-only source legs with no account on file."
              },
              "country_code": {
                "type": "string",
                "description": "ISO-2 settlement country override for this leg. Normally derived from the account; not echoed back in responses."
              },
              "currency": {
                "type": "string",
                "description": "Currency code. Required when no `account` is given (inline descriptor); otherwise a disambiguator for accounts spanning multiple currencies."
              },
              "rails": {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "description": "Explicit rail ids — e.g. `[\"ach\", \"wire\"]` or `[\"base\"]`. Omitting fans out across every rail the leg supports."
              },
              "schemas": {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "description": "Named rail groups — e.g. `[\"us_bank\"]` — expanded at request time."
              }
            }
          }
        ],
        "description": "One leg of a quote request."
      },
      "LinkMatchKey": {
        "type": "string",
        "description": "The identifying detail an associated person and an individual customer\nagree on.",
        "enum": [
          "tax_id",
          "email",
          "name_and_date_of_birth"
        ]
      },
      "LinkSuggestionDto": {
        "type": "object",
        "description": "An individual customer of yours who appears to be the same person as this\nassociated person, and the details that agree.",
        "required": [
          "customer_id",
          "matched_on",
          "kyc_status",
          "linked"
        ],
        "properties": {
          "customer_id": {
            "type": "string",
            "format": "uuid",
            "description": "Id of the suggested individual customer — the value to send as\n`customer_id` on the associated person to accept the suggestion."
          },
          "email": {
            "type": [
              "string",
              "null"
            ]
          },
          "first_name": {
            "type": [
              "string",
              "null"
            ]
          },
          "kyc_status": {
            "$ref": "#/components/schemas/KyStatus",
            "description": "The suggested customer's own verification status."
          },
          "last_name": {
            "type": [
              "string",
              "null"
            ]
          },
          "linked": {
            "type": "boolean",
            "description": "This customer is the one the person is linked to today."
          },
          "matched_on": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/LinkMatchKey"
            },
            "description": "Every detail the two records agree on exactly. Never empty."
          }
        }
      },
      "LinkSuggestionsResponse": {
        "type": "object",
        "required": [
          "suggestions"
        ],
        "properties": {
          "suggestions": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/LinkSuggestionDto"
            }
          }
        }
      },
      "LiquidationDestinationsResponse": {
        "type": "object",
        "description": "Body of `GET /customers/:id/liquidation-destinations`. Resolves,\nahead of an account create, whether a virtual fiat account in the\nrequested currency can auto-liquidate for this customer and which of\ntheir crypto accounts a sweep can settle to.",
        "required": [
          "supported",
          "destinations"
        ],
        "properties": {
          "can_turn_off": {
            "type": "boolean",
            "description": "Whether auto-liquidation on a virtual account in the requested\ncurrency, once on, can be turned off via\n`DELETE /v0/accounts/{id}/liquidation`. Always `false` when\n`supported` is `false`."
          },
          "destinations": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ApiAccount"
            },
            "description": "The customer's crypto accounts eligible as the `liquidation.account_id`\nof the create request. Any other account is rejected at create\ntime. Empty when `supported` is `false`."
          },
          "developer_fee_supported": {
            "type": "boolean",
            "description": "Whether `liquidation.developer_fee_bps` is accepted on a virtual\naccount in the requested currency for this customer. When `false`,\na create or `PUT /v0/accounts/{id}/liquidation` carrying a fee is\nrejected. Always `false` when `supported` is `false`."
          },
          "supported": {
            "type": "boolean",
            "description": "Whether auto-liquidation is available for a new virtual account\nin the requested currency for this customer. When `false`, a\ncreate carrying `liquidation` is rejected."
          }
        }
      },
      "LiquidationInput": {
        "type": "object",
        "description": "Auto-liquidation target for a virtual fiat account. References a\ncrypto account (virtual or external) the caller already created with\nSeismic; its currency determines what the credited fiat is converted\nto, so the caller supplies only the account id.",
        "required": [
          "account_id"
        ],
        "properties": {
          "account_id": {
            "type": "string",
            "format": "uuid"
          },
          "developer_fee_bps": {
            "type": [
              "integer",
              "null"
            ],
            "format": "int32",
            "description": "Your own developer fee in basis points (100 = 1%) on funds\nauto-converted through this account. Accepted where\n`GET /v0/customers/{id}/liquidation-destinations` reports\n`developer_fee_supported` for the currency; rejected elsewhere.\nAt most 999 (9.99%). Omit for no fee.",
            "minimum": 0
          }
        }
      },
      "ListAccountDepositsResponse": {
        "type": "object",
        "description": "Body of `GET /deposits`. Wrapped rather than returned as a bare\narray so future fields (cursors, totals) don't break the wire\nshape. `next_cursor` is set when more pages remain; absent on the\nlast page.",
        "required": [
          "deposits"
        ],
        "properties": {
          "deposits": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ApiAccountDeposit"
            }
          },
          "next_cursor": {
            "type": [
              "string",
              "null"
            ]
          }
        }
      },
      "ListAccountLiquidationsResponse": {
        "type": "object",
        "description": "Body of `GET /liquidations`. Wrapped rather than returned as a bare\narray so future fields (cursors, totals) don't break the wire\nshape. `next_cursor` is set when more pages remain; absent on the\nlast page.",
        "required": [
          "liquidations"
        ],
        "properties": {
          "liquidations": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ApiAccountLiquidation"
            }
          },
          "next_cursor": {
            "type": [
              "string",
              "null"
            ]
          }
        }
      },
      "ListAccountsResponse": {
        "type": "object",
        "description": "Body of `GET /accounts` and `GET /customers/:id/accounts`. Wrapped\nrather than returned as a bare array so future fields (cursors,\ntotals) don't break the wire shape. `next_cursor` is set when more\npages remain; absent on the last page.",
        "required": [
          "accounts"
        ],
        "properties": {
          "accounts": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ApiAccount"
            }
          },
          "next_cursor": {
            "type": [
              "string",
              "null"
            ]
          }
        }
      },
      "ListCustomersResponse": {
        "type": "object",
        "description": "`GET /v0/customers` response body.",
        "required": [
          "customers"
        ],
        "properties": {
          "customers": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/CustomerListItem"
            }
          },
          "next_cursor": {
            "type": [
              "string",
              "null"
            ],
            "description": "Pass back as `?cursor=` for the next page. `null` on the last page."
          }
        }
      },
      "MappingConfidence": {
        "type": "string",
        "description": "How closely a [`NaicsIndustryMapping`] target matches the code it\nreplaces.",
        "enum": [
          "high",
          "low"
        ]
      },
      "MexicanBankAccount": {
        "allOf": [
          {
            "$ref": "#/components/schemas/Payee"
          },
          {
            "type": "object",
            "required": [
              "clabe"
            ],
            "properties": {
              "clabe": {
                "type": "string"
              }
            }
          }
        ],
        "description": "`spei`."
      },
      "MinAmount": {
        "type": "object",
        "description": "The general minimum payment size for a currency/rail pair, per quote\nleg. A bank country can carry its own. Fields without a minimum are\nomitted.",
        "properties": {
          "destination": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "$ref": "#/components/schemas/LegMinAmount",
                "description": "Minimum when the pair is the quote's `destination` leg."
              }
            ]
          },
          "source": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "$ref": "#/components/schemas/LegMinAmount",
                "description": "Minimum when the pair is the quote's `source` leg."
              }
            ]
          }
        }
      },
      "NaicsIndustry": {
        "type": "object",
        "description": "One accepted industry — a six-digit NAICS code and its official title.",
        "required": [
          "code",
          "title"
        ],
        "properties": {
          "code": {
            "type": "string"
          },
          "title": {
            "type": "string"
          }
        }
      },
      "NaicsIndustryMapping": {
        "type": "object",
        "description": "An unsupported NAICS code and the accepted code closest to it.",
        "required": [
          "from",
          "from_title",
          "confidence"
        ],
        "properties": {
          "confidence": {
            "$ref": "#/components/schemas/MappingConfidence"
          },
          "from": {
            "type": "string"
          },
          "from_title": {
            "type": "string"
          },
          "to": {
            "type": [
              "string",
              "null"
            ],
            "description": "Absent when no accepted code describes this industry at all."
          },
          "to_title": {
            "type": [
              "string",
              "null"
            ]
          }
        }
      },
      "NaicsIndustryMappings": {
        "type": "object",
        "description": "Everything needed to translate an arbitrary NAICS code in one request:\nthe accepted codes to pass through untouched, and where to send the rest.",
        "required": [
          "supported",
          "mappings"
        ],
        "properties": {
          "mappings": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/NaicsIndustryMapping"
            }
          },
          "supported": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Codes `business.industry` accepts as-is — the [`all`] catalog with\nthe titles stripped, so a caller can answer \"is this fine?\" without\na second fetch."
          }
        }
      },
      "NoDetails": {
        "type": "object",
        "description": "`nip`: the rail is paid with nothing beyond the amount."
      },
      "OpenRfiDto": {
        "type": "object",
        "description": "One open request for information.",
        "required": [
          "id",
          "items"
        ],
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/OpenRfiItemDto"
            }
          },
          "sent_at": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          }
        }
      },
      "OpenRfiItemDto": {
        "type": "object",
        "description": "One requested item, as shown on the verification form.",
        "required": [
          "item_index",
          "text",
          "kind"
        ],
        "properties": {
          "document_kind": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "$ref": "#/components/schemas/DocumentKind",
                "description": "The document slot an upload answering this item fills, when the\nrequest names one. Upload the file under this kind so it lands in\nplace. Absent on every other item."
              }
            ]
          },
          "item_index": {
            "type": "integer",
            "description": "Position of this item within the request; quote it back when\nanswering.",
            "minimum": 0
          },
          "kind": {
            "$ref": "#/components/schemas/OpenRfiItemKind"
          },
          "person_name": {
            "type": [
              "string",
              "null"
            ],
            "description": "The associated person the request concerns, when it concerns one."
          },
          "text": {
            "type": "string",
            "description": "The request, written for the person filling in the form."
          }
        }
      },
      "OpenRfiItemKind": {
        "type": "string",
        "description": "A hint for the form about the answer a request expects. Every item\naccepts a written answer, a document, or both.",
        "enum": [
          "document",
          "other"
        ]
      },
      "OpenRfisResponse": {
        "type": "object",
        "description": "Response of the open-RFIs reads (hosted link and `/v0/customers`).",
        "required": [
          "rfis",
          "answered"
        ],
        "properties": {
          "answered": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/AnsweredRfiDto"
            },
            "description": "Requests already answered, newest first — a read-only record of the\nquestions and the answers given."
          },
          "rfis": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/OpenRfiDto"
            }
          }
        }
      },
      "OperatingAddress": {
        "allOf": [
          {
            "$ref": "#/components/schemas/Address"
          },
          {
            "type": "object",
            "properties": {
              "remote": {
                "type": "boolean",
                "description": "Deprecated — set `operating_is_remote` on the addresses object instead.\nStill accepted as the same declaration, and still returned in step with\n`operating_is_remote` while an operating address is on file."
              }
            }
          }
        ],
        "description": "The address the business operates from. Carries every `Address` field\ninline."
      },
      "OrderStatus": {
        "type": "string",
        "enum": [
          "awaiting_funds",
          "pending",
          "under_review",
          "processing",
          "sent",
          "completed",
          "expired",
          "failed",
          "canceled",
          "refunded",
          "unknown"
        ]
      },
      "OrgSettings": {
        "type": "object",
        "description": "Settings the organization manages itself.",
        "required": [
          "va_developer_fee_bps"
        ],
        "properties": {
          "va_developer_fee_bps": {
            "type": "integer",
            "format": "int32",
            "description": "Default developer fee, in basis points (`100` = 1%), for virtual\naccounts that auto-liquidate. It is only a default: it fills in\n`developer_fee_bps` when a virtual account is created, or its\nliquidation is updated, with a `liquidation` target but no fee of\nits own. A fee on the request, `0` included, always overrides it.\nIt never applies to quotes or payments, to virtual accounts without\nauto-liquidation, or to accounts that don't accept a developer fee,\nand changing it does not change accounts already set up. `0` (the\nstarting value) applies no fee.",
            "example": 50,
            "minimum": 0
          }
        }
      },
      "OrgSettingsPatch": {
        "type": "object",
        "description": "A partial update: each field present replaces the stored value, each\nabsent field leaves it unchanged.",
        "properties": {
          "va_developer_fee_bps": {
            "type": [
              "integer",
              "null"
            ],
            "format": "int32",
            "description": "See `va_developer_fee_bps` on the settings. Send `0` to stop\napplying a default fee.",
            "example": 50,
            "minimum": 0
          }
        },
        "additionalProperties": false
      },
      "PayInApprovalsResponse": {
        "type": "object",
        "required": [
          "pay_in"
        ],
        "properties": {
          "pay_in": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PaymentApproval"
            },
            "description": "Currency + rail combinations the customer may be funded with."
          }
        }
      },
      "Payee": {
        "type": "object",
        "description": "Who and where the payment goes to, and the reference it must carry, on\nevery rail that names an account.",
        "properties": {
          "account_holder_address": {
            "type": [
              "string",
              "null"
            ]
          },
          "account_holder_name": {
            "type": [
              "string",
              "null"
            ]
          },
          "bank_address": {
            "type": [
              "string",
              "null"
            ]
          },
          "bank_name": {
            "type": [
              "string",
              "null"
            ]
          },
          "deposit_reference": {
            "type": [
              "string",
              "null"
            ],
            "description": "Reference the payer must include on the transfer (memo, reference\nor remittance field) so it is matched to the order. If the bank\nlimits its length, send as much as fits, from the left."
          }
        }
      },
      "PaymentApproval": {
        "type": "object",
        "description": "One currency + rail the customer is cleared to move money over, and where\nthat clearance stands.",
        "required": [
          "currency",
          "rail",
          "status"
        ],
        "properties": {
          "country": {
            "type": [
              "string",
              "null"
            ],
            "description": "ISO 3166-1 alpha-2 country the payout settles in, when the approval is\ncountry-specific. Always absent on pay-ins.",
            "example": "MX"
          },
          "currency": {
            "type": "string",
            "description": "Currency the leg moves.",
            "example": "USD"
          },
          "rail": {
            "type": "string",
            "description": "Rail the leg settles over, in Seismic's rail vocabulary — the same\nnames accepted when creating an account or a quote.",
            "example": "ach"
          },
          "status": {
            "$ref": "#/components/schemas/ApprovalStatus",
            "description": "Where this approval stands. `approved` is the only state that can\ncarry a payment."
          },
          "status_detail": {
            "type": [
              "string",
              "null"
            ],
            "description": "The reviewer's own wording behind `status`, when there is one. Finer\ngrained than `status` and not a fixed set — read `status` to decide\nanything, and treat this as a human-readable hint.",
            "example": "UNDER_REVIEW"
          }
        }
      },
      "PaymentLink": {
        "type": "object",
        "description": "`pse`.",
        "required": [
          "payment_link"
        ],
        "properties": {
          "payment_link": {
            "type": "string",
            "description": "Page the payer completes the payment on."
          }
        }
      },
      "PaymentReason": {
        "type": "string",
        "description": "Why a payment is being made. Banks key compliance decisions off this,\nso downstream settlement networks require one of these fixed\ncategories on every payment. Partner-facing: supplied on the accept\nrequest, persisted on the order, and mapped to the settlement\nnetwork's enum at dispatch.\n\nDistinct from [`SourceOfFunds`] — that answers *where the money came\nfrom*; this answers *why it's being sent*. The two are carried as\nseparate fields end to end.",
        "enum": [
          "charitable_contributions",
          "education_fees",
          "employee_salaries_or_wages",
          "gifts",
          "investments",
          "dividend",
          "purchase_of_goods",
          "purchase_of_services",
          "personal_transfers",
          "rent",
          "loans",
          "utility_bills",
          "family_support",
          "friends_support",
          "real_estate",
          "insurance",
          "intercompany_transfer",
          "taxes",
          "travel"
        ]
      },
      "PaymentReasonInfo": {
        "type": "object",
        "description": "One accepted payment reason and a display label for it.",
        "required": [
          "value",
          "label"
        ],
        "properties": {
          "label": {
            "type": "string",
            "description": "Human-readable label suitable for a picker or receipt."
          },
          "value": {
            "type": "string",
            "description": "Wire token accepted on an accept request's `payment_reason`."
          }
        }
      },
      "PaymentReasonsResp": {
        "type": "object",
        "required": [
          "payment_reasons"
        ],
        "properties": {
          "payment_reasons": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PaymentReasonInfo"
            }
          }
        }
      },
      "PayoutApprovalsResponse": {
        "type": "object",
        "required": [
          "payout"
        ],
        "properties": {
          "payout": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PaymentApproval"
            },
            "description": "Currency + rail + country combinations the customer may be paid out to."
          }
        }
      },
      "PhilippineBankAccount": {
        "allOf": [
          {
            "$ref": "#/components/schemas/Payee"
          },
          {
            "type": "object",
            "required": [
              "account_number"
            ],
            "properties": {
              "account_number": {
                "type": "string"
              }
            }
          }
        ],
        "description": "`instapay`, `pesonet`."
      },
      "PixCode": {
        "type": "object",
        "description": "`pix`.",
        "required": [
          "pix_code"
        ],
        "properties": {
          "pix_code": {
            "type": "string",
            "description": "Copy-and-paste code (BR Code) for the payer's banking app."
          }
        }
      },
      "PixKeyKind": {
        "type": "string",
        "description": "PIX key kind on the `br_pix` shape. Each kind implies a distinct\nkey format: `cpf` (11 digits), `cnpj` (14 digits), `email`,\n`phone` (`+55` then 10–11 digits), or `evp` (a randomly assigned\nUUID).",
        "enum": [
          "cpf",
          "cnpj",
          "email",
          "phone",
          "evp"
        ]
      },
      "ProfileValidation": {
        "type": "object",
        "description": "Whether the saved profile would pass submit's checks.",
        "required": [
          "valid",
          "missing",
          "violations"
        ],
        "properties": {
          "missing": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Dotted paths of required fields the profile is missing."
          },
          "valid": {
            "type": "boolean",
            "description": "`true` when submit would accept the saved profile as it stands."
          },
          "violations": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Violation"
            },
            "description": "Fields that are present but fail a format or content check."
          }
        }
      },
      "ProofOfAddressType": {
        "type": "string",
        "description": "What a proof of address is. Declared with the upload, because each\nverification review files a proof of address under one of these and\nnothing else about the file says which.",
        "enum": [
          "utility_bill",
          "bank_statement",
          "rental_agreement",
          "tax_document",
          "government_correspondence"
        ]
      },
      "Quote": {
        "type": "object",
        "description": "One priced route for the requested trade: nested `in` + `out`\nlegs, structured `fees`, and the exchange `rate`. Accept a quote\nby its `id` before `expires_at` passes.",
        "required": [
          "id",
          "in",
          "out",
          "fees",
          "rate",
          "supported_expired_quote_behaviors"
        ],
        "properties": {
          "expires_at": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          },
          "fees": {
            "$ref": "#/components/schemas/QuoteFees"
          },
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "in": {
            "$ref": "#/components/schemas/Leg"
          },
          "out": {
            "$ref": "#/components/schemas/Leg"
          },
          "rate": {
            "type": "string"
          },
          "supported_expired_quote_behaviors": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ExpiredQuoteBehavior"
            },
            "description": "Expired-quote behaviors `accept` will honor for this quote via\n`expired_quote_behavior`. Empty when only the default — the\npayment is refunded on expiry — applies."
          }
        }
      },
      "QuoteAcceptanceRequirements": {
        "type": "object",
        "description": "Known requirements for accepting this specific quote.",
        "required": [
          "files_required",
          "source_account_number_required"
        ],
        "properties": {
          "files_required": {
            "type": "boolean",
            "description": "Attach at least one supporting document in the accept body's `files`\nwhen true. Additional documents may be requested during processing."
          },
          "source_account_number_required": {
            "type": "boolean",
            "description": "Send the payer's bank account number as the accept body's\n`source_account_number` when true. When false, accept rejects\n`source_account_number`."
          }
        }
      },
      "QuoteDestination": {
        "oneOf": [
          {
            "type": "string",
            "format": "uuid",
            "description": "Bare account id — shorthand for `{ \"account\": \"<id>\" }`."
          },
          {
            "type": "object",
            "description": "Registered account, optionally pinned to a subset of its rails. Unknown fields are rejected.",
            "required": [
              "account"
            ],
            "properties": {
              "account": {
                "type": "string",
                "format": "uuid",
                "description": "Id of the registered destination account."
              },
              "rails": {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "description": "Rail subset to price — omitting fans out across every rail the account supports."
              }
            }
          }
        ],
        "description": "Destination leg of the quote — always a registered account."
      },
      "QuoteFeeItem": {
        "oneOf": [
          {
            "type": "object",
            "required": [
              "amount",
              "currency",
              "type"
            ],
            "properties": {
              "amount": {
                "type": "string"
              },
              "currency": {
                "type": "string"
              },
              "description": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "type": {
                "type": "string",
                "enum": [
                  "flat"
                ]
              }
            }
          },
          {
            "type": "object",
            "required": [
              "bps",
              "amount",
              "currency",
              "type"
            ],
            "properties": {
              "amount": {
                "type": "string"
              },
              "bps": {
                "type": "integer",
                "format": "int32",
                "minimum": 0
              },
              "currency": {
                "type": "string"
              },
              "description": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "type": {
                "type": "string",
                "enum": [
                  "percentage"
                ]
              }
            }
          },
          {
            "type": "object",
            "required": [
              "amount",
              "currency",
              "type"
            ],
            "properties": {
              "amount": {
                "type": "string"
              },
              "currency": {
                "type": "string"
              },
              "description": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "type": {
                "type": "string",
                "enum": [
                  "network"
                ]
              }
            }
          },
          {
            "type": "object",
            "required": [
              "amount",
              "currency",
              "description",
              "type"
            ],
            "properties": {
              "amount": {
                "type": "string"
              },
              "currency": {
                "type": "string"
              },
              "description": {
                "type": "string"
              },
              "type": {
                "type": "string",
                "enum": [
                  "other"
                ]
              }
            }
          }
        ],
        "description": "Single fee line item on a quote. The `type` field discriminates\nthe variants."
      },
      "QuoteFees": {
        "type": "object",
        "description": "Fee breakdown attached to a quote. `total` is the sum across\n`items`, denominated in `currency` (typically the source leg's\ncurrency — what the caller pays in). When no per-item breakdown is\navailable, `items` is empty and the fee is implicit in the quote's\n`rate`.",
        "required": [
          "items",
          "total",
          "currency"
        ],
        "properties": {
          "currency": {
            "type": "string"
          },
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/QuoteFeeItem"
            }
          },
          "total": {
            "type": "string"
          }
        }
      },
      "QuotePayer": {
        "type": "object",
        "description": "Who is paying a pay-in, as the quote body names them.",
        "properties": {
          "bank_code": {
            "type": [
              "string",
              "null"
            ],
            "description": "The code of the bank the payer pays from, in the scheme's own\nbank list."
          },
          "document_number": {
            "type": [
              "string",
              "null"
            ],
            "description": "The number of the payer's identity document."
          },
          "document_type": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "$ref": "#/components/schemas/CoIdType",
                "description": "The kind of identity document `document_number` is, spelled as on\na Colombian account's `details.id_type`."
              }
            ]
          },
          "email": {
            "type": [
              "string",
              "null"
            ]
          },
          "full_name": {
            "type": [
              "string",
              "null"
            ],
            "description": "The payer's full legal name."
          },
          "phone": {
            "type": [
              "string",
              "null"
            ],
            "description": "The payer's mobile number in E.164 form."
          },
          "tax_id": {
            "type": [
              "string",
              "null"
            ],
            "description": "The payer's tax id, for rails that credit only a transfer sent under\nit. ARS: the payer's CUIT/CUIL, 11 digits with no separators\n(`20123456786`)."
          }
        }
      },
      "QuoteRequestEcho": {
        "type": "object",
        "description": "Echo of the original request carried on the quote snapshot. Legs\ncome back resolved rather than in whichever of the request forms\nproduced them.",
        "required": [
          "end_customer_id",
          "end_customer_type",
          "amount",
          "amount_leg",
          "source",
          "destination",
          "named"
        ],
        "properties": {
          "amount": {
            "type": "string"
          },
          "amount_leg": {
            "$ref": "#/components/schemas/AmountLeg",
            "description": "Which leg `amount` fixed: `source` (exact-in, the default) or\n`destination` (exact-out)."
          },
          "destination": {
            "$ref": "#/components/schemas/QuoteRequestEchoLeg"
          },
          "end_customer_id": {
            "type": "string",
            "format": "uuid"
          },
          "end_customer_type": {
            "$ref": "#/components/schemas/CustomerKind"
          },
          "named": {
            "type": "boolean",
            "description": "Whether the quote was created with `?named=1`. When `true`, `quotes`\nholds only named options and accept takes only a named one."
          },
          "payer": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "$ref": "#/components/schemas/QuotePayer",
                "description": "The `payer` block the request carried, whichever rail it was for."
              }
            ]
          },
          "source": {
            "$ref": "#/components/schemas/QuoteRequestEchoLeg"
          }
        }
      },
      "QuoteRequestEchoLeg": {
        "type": "object",
        "description": "One side of the snapshot's `request` echo: the resolved corridor\n(`currency` + `rails`), plus the registered account when the leg\nwas account-backed. `account_id` is absent on inline source legs.",
        "required": [
          "currency",
          "rails"
        ],
        "properties": {
          "account_id": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid"
          },
          "currency": {
            "type": "string"
          },
          "rails": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        }
      },
      "QuoteRequestStatus": {
        "type": "string",
        "enum": [
          "pending",
          "ready",
          "expired"
        ]
      },
      "QuoteRequirements": {
        "type": "object",
        "required": [
          "currency",
          "supporting_document"
        ],
        "properties": {
          "bank_country_conditions": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SupportingDocumentBankCountryCondition"
            },
            "description": "Beneficiary bank countries where a payout can require a supporting\ndocument at any amount, on top of `supporting_document`. Whether a\npriced quote takes one is its `acceptance_requirements.files_required`.\nOmitted when there are none."
          },
          "currency": {
            "type": "string"
          },
          "route_conditions": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SupportingDocumentRouteCondition"
            },
            "description": "Routes that require a supporting document at any amount, on top of\n`supporting_document`. Whether a priced quote takes one is its\n`acceptance_requirements.files_required`. Omitted when there are none."
          },
          "supporting_document": {
            "$ref": "#/components/schemas/SupportingDocumentRequirement"
          }
        }
      },
      "RailInfo": {
        "type": "object",
        "description": "One settlement rail.",
        "required": [
          "rail",
          "kind"
        ],
        "properties": {
          "kind": {
            "type": "string",
            "description": "`fiat` or `crypto`."
          },
          "rail": {
            "type": "string"
          }
        }
      },
      "RailKind": {
        "type": "string",
        "enum": [
          "fiat",
          "crypto"
        ]
      },
      "RailSelection": {
        "oneOf": [
          {
            "type": "string"
          },
          {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        ],
        "description": "Settlement rails a destination bank account is registered for: a\nlist of rail names, or a single one.\n\nNaming several rails registers the bank identifier supplied in\n`details` for each of them, which asserts that the one identifier\nreceives all of them. Most US banks do receive both ACH and wire on\none routing number; where a bank publishes a different number per\nrail, the `details` body carries one per rail instead.\n\nNames are matched case-insensitively and ignore surrounding\nwhitespace. Repeats are collapsed, keeping first-named order. An\nempty list is not a selection and is rejected."
      },
      "RailsResp": {
        "type": "object",
        "required": [
          "rails"
        ],
        "properties": {
          "rails": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/RailInfo"
            }
          }
        }
      },
      "RateDto": {
        "type": "object",
        "description": "Mid-market reference rate: the price of `from` denominated in `to`\n(destination units per one unit of source), as a 5-decimal string.",
        "required": [
          "from",
          "to",
          "rate",
          "as_of"
        ],
        "properties": {
          "as_of": {
            "type": "string",
            "format": "date-time"
          },
          "from": {
            "type": "string"
          },
          "rate": {
            "type": "string"
          },
          "to": {
            "type": "string"
          }
        }
      },
      "RatesResponse": {
        "type": "object",
        "required": [
          "rates"
        ],
        "properties": {
          "rates": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/RateDto"
            }
          }
        }
      },
      "RegulatedStatus": {
        "type": "string",
        "enum": [
          "regulated",
          "registered",
          "licensed",
          "not_required"
        ]
      },
      "RequirementLevel": {
        "type": "string",
        "enum": [
          "required",
          "optional"
        ]
      },
      "RfiAnswerInput": {
        "type": "object",
        "description": "One answer, keyed to an open request item: a written answer, the id of\na document already uploaded for this customer, or both.",
        "required": [
          "rfi_id",
          "item_index"
        ],
        "properties": {
          "answer": {
            "type": [
              "string",
              "null"
            ],
            "description": "The written answer. Optional when `document_id` is given."
          },
          "document_id": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid",
            "description": "Id of a document uploaded for this customer that answers the item.\nOptional when `answer` is given."
          },
          "item_index": {
            "type": "integer",
            "description": "`item_index` of the answered item, from the open-requests list.",
            "minimum": 0
          },
          "rfi_id": {
            "type": "string",
            "format": "uuid",
            "description": "Id of the open request, from the open-requests list."
          }
        }
      },
      "SandboxAccountCapabilities": {
        "type": "object",
        "required": [
          "account_id",
          "status",
          "can_transact",
          "can_replace"
        ],
        "properties": {
          "account_id": {
            "type": "string",
            "format": "uuid"
          },
          "can_replace": {
            "type": "boolean"
          },
          "can_transact": {
            "type": "boolean"
          },
          "replacement_account_id": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid"
          },
          "status": {
            "$ref": "#/components/schemas/SandboxWalletStatus"
          }
        }
      },
      "SandboxAccountReplacement": {
        "type": "object",
        "required": [
          "predecessor_account_id",
          "successor_account_id"
        ],
        "properties": {
          "predecessor_account_id": {
            "type": "string",
            "format": "uuid"
          },
          "successor_account_id": {
            "type": "string",
            "format": "uuid"
          }
        }
      },
      "SandboxDepositCurrenciesResponse": {
        "type": "object",
        "required": [
          "currencies"
        ],
        "properties": {
          "currencies": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SandboxDepositCurrency"
            }
          }
        }
      },
      "SandboxDepositCurrency": {
        "type": "object",
        "required": [
          "currency",
          "virtual_account_deposits",
          "order_funding"
        ],
        "properties": {
          "currency": {
            "type": "string"
          },
          "order_funding": {
            "type": "boolean"
          },
          "virtual_account_deposits": {
            "type": "boolean"
          }
        }
      },
      "SandboxDepositRequest": {
        "type": "object",
        "required": [
          "amount",
          "currency"
        ],
        "properties": {
          "amount": {
            "type": "string",
            "description": "Positive decimal string, at most 1000000 with at most two decimal places."
          },
          "currency": {
            "type": "string",
            "description": "Must equal the account's currency."
          }
        },
        "additionalProperties": false
      },
      "SandboxDepositResponse": {
        "type": "object",
        "required": [
          "account_id",
          "deposit_id",
          "payment_advanced"
        ],
        "properties": {
          "account_id": {
            "type": "string",
            "format": "uuid"
          },
          "deposit_id": {
            "type": "string"
          },
          "payment_advanced": {
            "type": "boolean",
            "description": "Whether a waiting payment was matched. Automatic liquidation proceeds asynchronously."
          }
        }
      },
      "SandboxDepositReturnRequest": {
        "type": "object",
        "properties": {
          "reason": {
            "type": [
              "string",
              "null"
            ],
            "description": "Why the funds went back to the sender, reported as the deposit's\n`status_reason`. At most 500 characters."
          }
        },
        "additionalProperties": false
      },
      "SandboxKycRejectionRequest": {
        "type": "object",
        "properties": {
          "rejection_reason": {
            "type": [
              "string",
              "null"
            ]
          }
        },
        "additionalProperties": false
      },
      "SandboxOrderFundingResponse": {
        "type": "object",
        "required": [
          "order_id",
          "funding_id",
          "amount",
          "currency"
        ],
        "properties": {
          "amount": {
            "type": "string"
          },
          "currency": {
            "type": "string"
          },
          "funding_id": {
            "type": "string"
          },
          "order_id": {
            "type": "string",
            "format": "uuid"
          }
        }
      },
      "SandboxRfiItem": {
        "type": "object",
        "required": [
          "text"
        ],
        "properties": {
          "document_kind": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "$ref": "#/components/schemas/DocumentKind",
                "description": "The document slot an upload answering this item fills."
              }
            ]
          },
          "text": {
            "type": "string",
            "description": "The request, as the person answering reads it. At most 5000 characters."
          }
        },
        "additionalProperties": false
      },
      "SandboxRfiRequest": {
        "type": "object",
        "required": [
          "items"
        ],
        "properties": {
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SandboxRfiItem"
            },
            "description": "What the customer is asked for: 1 to 20 items."
          }
        },
        "additionalProperties": false
      },
      "SandboxSettlementAsset": {
        "type": "object",
        "required": [
          "chain_id",
          "currency",
          "contract_address"
        ],
        "properties": {
          "chain_id": {
            "type": "integer",
            "format": "int64",
            "minimum": 0
          },
          "contract_address": {
            "type": "string"
          },
          "currency": {
            "type": "string"
          }
        },
        "additionalProperties": false
      },
      "SandboxSettlementToken": {
        "type": "object",
        "required": [
          "chain_id",
          "currency",
          "contract_address",
          "decimals",
          "automatic_funding",
          "funding_instructions"
        ],
        "properties": {
          "automatic_funding": {
            "type": "boolean"
          },
          "chain_id": {
            "type": "integer",
            "format": "int64",
            "minimum": 0
          },
          "contract_address": {
            "type": "string"
          },
          "currency": {
            "type": "string"
          },
          "decimals": {
            "type": "integer",
            "format": "int32",
            "minimum": 0
          },
          "funding_instructions": {
            "type": "string"
          }
        }
      },
      "SandboxWalletStatus": {
        "type": "string",
        "enum": [
          "available",
          "requires_replacement",
          "replaced",
          "unsupported_holder",
          "customer_unavailable",
          "unavailable"
        ]
      },
      "SchemaInfo": {
        "type": "object",
        "description": "One schema — a stable name plus the rail family it expands to.",
        "required": [
          "schema",
          "kind",
          "rails"
        ],
        "properties": {
          "kind": {
            "$ref": "#/components/schemas/RailKind"
          },
          "rails": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "schema": {
            "type": "string"
          }
        }
      },
      "SchemasResponse": {
        "type": "object",
        "required": [
          "schemas"
        ],
        "properties": {
          "schemas": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SchemaInfo"
            }
          }
        }
      },
      "SocCode": {
        "type": "object",
        "description": "One accepted occupation — a six-digit SOC code and its official title.",
        "required": [
          "code",
          "description"
        ],
        "properties": {
          "code": {
            "type": "string",
            "description": "Six-digit SOC code in `NN-NNNN` form."
          },
          "description": {
            "type": "string",
            "description": "The occupation's official title."
          }
        }
      },
      "SourceOfFunds": {
        "type": "string",
        "enum": [
          "salary",
          "savings",
          "business_revenue",
          "company_capital",
          "investment_returns",
          "inheritance",
          "trust",
          "gift",
          "grant",
          "sale_of_assets",
          "real_estate",
          "loan",
          "private_capital",
          "marital",
          "winnings",
          "other"
        ]
      },
      "SourceOfWealth": {
        "type": "string",
        "description": "Where a beneficial owner's overall wealth came from.\n\nThe net-worth question, distinct from `primary_source_of_funds`, the\nbusiness's historical source of funds: where its funds have come from to\ndate. A person gives one answer.",
        "enum": [
          "salary",
          "dividends",
          "property_rental",
          "investment",
          "inheritance",
          "gambling",
          "donation"
        ]
      },
      "SubmitOrderDocumentRequest": {
        "$ref": "#/components/schemas/SupportingFile",
        "description": "Body for `POST /v0/customers/orders/:id/documents`: the same typed\ndocument an accept's `files` entry carries."
      },
      "SubmitRequest": {
        "type": "object",
        "description": "Body shared by the submit endpoints that accept acceptance context.",
        "properties": {
          "end_user": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "$ref": "#/components/schemas/EndUserContext"
              }
            ]
          }
        },
        "additionalProperties": false
      },
      "SubmitRfiAnswersRequest": {
        "type": "object",
        "description": "Answers to open information requests.",
        "required": [
          "answers"
        ],
        "properties": {
          "answers": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/RfiAnswerInput"
            }
          }
        }
      },
      "SubmitRfiAnswersResponse": {
        "type": "object",
        "required": [
          "recorded",
          "supplemental_entries"
        ],
        "properties": {
          "recorded": {
            "type": "integer",
            "description": "Answers recorded. An answer identical to the latest recorded one for\nthe same item is acknowledged without being recorded again.",
            "minimum": 0
          },
          "supplemental_entries": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SupplementalEntry"
            },
            "description": "The supplemental entries filed by this call. A document uploaded\nunder a structured kind has already replaced the form's document of\nthat kind and is never filed here. A document uploaded under the\ncatch-all `other` kind is placed during review: it is filed into the\nprofile's `supplemental` section, or moved into the slot it belongs\nin, by the reviewer. Only when no review will place it is it filed\nhere at once, as a document entry whose `description` is the item\nit answers."
          }
        }
      },
      "SupplementalEntry": {
        "type": "object",
        "description": "One supplemental-information entry: a free-form text note or a document\nattachment, each carrying a title and description.",
        "required": [
          "kind"
        ],
        "properties": {
          "description": {
            "type": [
              "string",
              "null"
            ]
          },
          "document_id": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid",
            "description": "The uploaded document this entry attaches (kind `supplemental`).\nDocument entries only."
          },
          "id": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid",
            "description": "Stable per-entry id assigned on first persistence. Omitted on\ncreate; echo it back to keep the entry stable across saves."
          },
          "kind": {
            "$ref": "#/components/schemas/SupplementalEntryKind"
          },
          "title": {
            "type": [
              "string",
              "null"
            ]
          }
        }
      },
      "SupplementalEntryKind": {
        "type": "string",
        "description": "Discriminant of a profile's supplemental-information entry: a free-form\ntext note or a document attachment.",
        "enum": [
          "text",
          "document"
        ]
      },
      "SupportingDocumentBankCountryCondition": {
        "type": "object",
        "description": "A beneficiary bank country where a payout may require a supporting\ndocument whatever the currency or amount.",
        "required": [
          "bank_country",
          "description"
        ],
        "properties": {
          "bank_country": {
            "type": "string",
            "description": "ISO 3166-1 alpha-2 country of the beneficiary's bank.",
            "example": "IN"
          },
          "description": {
            "type": "string"
          }
        }
      },
      "SupportingDocumentBeneficiary": {
        "type": "string",
        "enum": [
          "third_party"
        ]
      },
      "SupportingDocumentCondition": {
        "type": "object",
        "required": [
          "field",
          "operator",
          "value",
          "currency"
        ],
        "properties": {
          "currency": {
            "type": "string"
          },
          "field": {
            "$ref": "#/components/schemas/SupportingDocumentField"
          },
          "operator": {
            "$ref": "#/components/schemas/SupportingDocumentOperator"
          },
          "value": {
            "type": "string",
            "description": "Exact decimal threshold in the destination currency."
          }
        }
      },
      "SupportingDocumentField": {
        "type": "string",
        "enum": [
          "destination_amount"
        ]
      },
      "SupportingDocumentOperator": {
        "type": "string",
        "enum": [
          "gte"
        ]
      },
      "SupportingDocumentRef": {
        "type": "object",
        "description": "One supporting document reference: the `document_id` returned by\nthe documents upload endpoint, plus a semantic `kind`.",
        "required": [
          "kind",
          "document_id"
        ],
        "properties": {
          "document_id": {
            "type": "string",
            "format": "uuid"
          },
          "kind": {
            "type": "string"
          },
          "proof_of_address_type": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "$ref": "#/components/schemas/ProofOfAddressType",
                "description": "What a `proof_of_address` is, as declared at upload. Read-only:\nfilled in from the document on read."
              }
            ]
          }
        }
      },
      "SupportingDocumentRequirement": {
        "oneOf": [
          {
            "type": "object",
            "required": [
              "description",
              "requirement"
            ],
            "properties": {
              "description": {
                "type": "string"
              },
              "requirement": {
                "type": "string",
                "enum": [
                  "required"
                ]
              }
            }
          },
          {
            "type": "object",
            "required": [
              "condition",
              "description",
              "requirement"
            ],
            "properties": {
              "condition": {
                "$ref": "#/components/schemas/SupportingDocumentCondition"
              },
              "description": {
                "type": "string"
              },
              "requirement": {
                "type": "string",
                "enum": [
                  "conditional"
                ]
              }
            }
          },
          {
            "type": "object",
            "required": [
              "description",
              "requirement"
            ],
            "properties": {
              "description": {
                "type": "string"
              },
              "requirement": {
                "type": "string",
                "enum": [
                  "not_required"
                ]
              }
            }
          }
        ]
      },
      "SupportingDocumentRouteCondition": {
        "type": "object",
        "description": "A route on which a payment to someone other than the customer may be\nheld for a supporting document.",
        "required": [
          "destination_rail",
          "beneficiary",
          "description"
        ],
        "properties": {
          "beneficiary": {
            "$ref": "#/components/schemas/SupportingDocumentBeneficiary"
          },
          "description": {
            "type": "string"
          },
          "destination_rail": {
            "type": "string"
          }
        }
      },
      "SupportingFile": {
        "type": "object",
        "description": "One supporting document and what it is.",
        "required": [
          "type",
          "file"
        ],
        "properties": {
          "file": {
            "type": "string",
            "description": "The document as a base64 data URI: `data:<mime>;base64,<contents>`.\nPDF / JPEG / PNG, at most 5 MB."
          },
          "type": {
            "$ref": "#/components/schemas/TransactionDocumentType",
            "description": "What the document is."
          }
        },
        "additionalProperties": false
      },
      "SwiftAccount": {
        "allOf": [
          {
            "$ref": "#/components/schemas/Payee"
          },
          {
            "type": "object",
            "required": [
              "account_number",
              "bic"
            ],
            "properties": {
              "account_number": {
                "type": "string"
              },
              "bic": {
                "type": "string",
                "description": "BIC / SWIFT code of the receiving bank."
              },
              "routing_number": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "ABA routing number, for a US receiving bank."
              }
            }
          }
        ],
        "description": "`swift`."
      },
      "TaxIdType": {
        "type": "string",
        "description": "Which US taxpayer identifier an associated person's `tax_id` is. An SSN\nand an ITIN cannot be told apart by format, and verification needs to know\nwhich register to check.",
        "enum": [
          "ssn",
          "itin"
        ]
      },
      "TransactionDocumentType": {
        "type": "string",
        "description": "What a supporting document filed with a payment is: the transaction\ndocument set, distinct from the identity documents a verification\nprofile carries. Compliance review reads a payment's document as this\ntype, so a held payment clears faster when it matches the document.",
        "enum": [
          "invoice",
          "purchase_order",
          "delivery_slip",
          "contract",
          "customs_declaration",
          "bill_of_lading",
          "other"
        ]
      },
      "UkBankAccount": {
        "allOf": [
          {
            "$ref": "#/components/schemas/Payee"
          },
          {
            "type": "object",
            "required": [
              "account_number",
              "sort_code"
            ],
            "properties": {
              "account_number": {
                "type": "string"
              },
              "sort_code": {
                "type": "string"
              }
            }
          }
        ],
        "description": "`bacs`, `fps`."
      },
      "UpdateExternalFiatHolderRequest": {
        "type": "object",
        "description": "Holder facts added to or corrected on an external bank account after\ncreate. Send at least one field; an omitted field is left as it is.",
        "properties": {
          "industry": {
            "type": [
              "string",
              "null"
            ],
            "description": "The six-digit NAICS code of the holder business's industry, from\n`GET /v0/industries/account-holder`; any other code is rejected.\nBusiness holders only."
          },
          "is_third_party": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Corrects whether the account belongs to someone other than the\ncustomer. Changing it discards the `relationship` the account was\ncreated with, since that was given for the other party, unless this\nrequest sends a new one."
          },
          "relationship": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "$ref": "#/components/schemas/HolderRelationship",
                "description": "Who the holder is to the customer, as one of the codes\n`GET /v0/accounts/fiat/external/requirements` publishes under\n`account_holder.relationship` for the holder's `type`."
              }
            ]
          }
        },
        "additionalProperties": false
      },
      "UpsertCustomerProfileRequest": {
        "oneOf": [
          {
            "type": "object",
            "required": [
              "profile",
              "type"
            ],
            "properties": {
              "profile": {
                "$ref": "#/components/schemas/KycProfile"
              },
              "type": {
                "type": "string",
                "enum": [
                  "individual"
                ]
              }
            }
          },
          {
            "type": "object",
            "required": [
              "profile",
              "type"
            ],
            "properties": {
              "profile": {
                "$ref": "#/components/schemas/KybProfile"
              },
              "type": {
                "type": "string",
                "enum": [
                  "business"
                ]
              }
            }
          }
        ],
        "description": "Request body for `PUT /v0/customers/:id/kyc/profile`. The link is\nserver-managed and not part of the upsert surface, so callers send\nonly `{ type, profile }` — `kyc_link` is read-only and absent here."
      },
      "UsBankAccount": {
        "allOf": [
          {
            "$ref": "#/components/schemas/Payee"
          },
          {
            "type": "object",
            "required": [
              "account_number",
              "routing_number"
            ],
            "properties": {
              "account_number": {
                "type": "string"
              },
              "routing_number": {
                "type": "string",
                "description": "ABA routing number."
              }
            }
          }
        ],
        "description": "`ach`, `wire`."
      },
      "UsBankAccountType": {
        "type": "string",
        "description": "Type of a US deposit account.",
        "enum": [
          "CHECKING",
          "SAVINGS"
        ]
      },
      "UsDepositAccountType": {
        "type": "string",
        "description": "How an issuing bank labels a US deposit account on the payment\ninstructions it publishes for it.\n\nDistinct from the `account_type` supplied when registering an external\naccount, which names the deposit product. This is a label reported\nback, not a choice made: the account already exists and the bank prints\none of these on the instructions a payer copies.\n\nThe full holder × product grid, not only the labels seen so far: a bank\nthat starts publishing a savings account has a variant waiting rather\nthan a label that reads as absent. Anything outside the grid still reads\nas absent, and earns a variant here when it turns up.",
        "enum": [
          "PERSONAL_CHECKING",
          "PERSONAL_SAVINGS",
          "BUSINESS_CHECKING",
          "BUSINESS_SAVINGS"
        ]
      },
      "Violation": {
        "type": "object",
        "description": "One per-field validation finding, surfaced inline on the error\nenvelope so callers can render per-field hints without parsing the\nhuman-readable `message`.",
        "required": [
          "reason",
          "description"
        ],
        "properties": {
          "allowed": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "type": "string"
            },
            "description": "Closed list of accepted values for `field`. Present when the\nconstraint is a \"must be one of …\" rule; omitted otherwise."
          },
          "description": {
            "type": "string",
            "description": "Human-readable explanation of the constraint that failed."
          },
          "field": {
            "type": [
              "string",
              "null"
            ],
            "description": "Dotted path of the offending request field (e.g.\n`account_holder.address.line1`). Absent when the finding applies\nto the request as a whole rather than a single field."
          },
          "reason": {
            "$ref": "#/components/schemas/ViolationReason"
          }
        }
      },
      "ViolationReason": {
        "type": "string",
        "description": "Stable machine-readable slug classifying a `Violation`. New slugs\nmay be added over time; treat unknown slugs as `other`.",
        "enum": [
          "missing",
          "invalid_format",
          "too_short",
          "too_long",
          "not_in_allowed_set",
          "unknown_field",
          "out_of_range",
          "other"
        ]
      },
      "VirtualAccountApproval": {
        "type": "object",
        "description": "One virtual account the customer can be issued: the currency it collects,\nthe bank that backs it, and what Seismic charges to maintain it.",
        "required": [
          "status"
        ],
        "properties": {
          "bank": {
            "type": [
              "string",
              "null"
            ],
            "description": "Bank backing the account, as the account catalog spells it — the\nsame value `GET /customers/{id}/virtual-account-banks` serves and the\ncreate payload takes.",
            "example": "PORTAGE_BANK"
          },
          "country": {
            "type": [
              "string",
              "null"
            ],
            "description": "ISO 3166-1 alpha-2 country the account is domiciled in.",
            "example": "US"
          },
          "currency": {
            "type": [
              "string",
              "null"
            ],
            "description": "Currency the account collects in.",
            "example": "USD"
          },
          "maintenance_fee": {
            "type": [
              "number",
              "null"
            ],
            "format": "double",
            "description": "Flat maintenance fee for this virtual account, in `currency`.",
            "example": 0.5
          },
          "status": {
            "$ref": "#/components/schemas/ApprovalStatus",
            "description": "Where this account stands. `approved` means it can be issued today."
          },
          "status_detail": {
            "type": [
              "string",
              "null"
            ],
            "description": "The reviewer's own wording behind `status`, as on [`PaymentApproval`].",
            "example": "NOT_STARTED"
          }
        }
      },
      "VirtualAccountApprovalsResponse": {
        "type": "object",
        "required": [
          "virtual_accounts"
        ],
        "properties": {
          "virtual_accounts": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/VirtualAccountApproval"
            }
          }
        }
      },
      "VirtualAccountBank": {
        "type": "object",
        "description": "A bank a virtual account can be opened at.",
        "required": [
          "bank",
          "name",
          "country",
          "party"
        ],
        "properties": {
          "bank": {
            "type": "string",
            "description": "Identifier for the bank. This is the value to send as `bank` when\ncreating the virtual account.",
            "example": "PORTAGE_BANK"
          },
          "country": {
            "type": "string",
            "description": "ISO 3166-1 alpha-2 country the account would be domiciled in.",
            "example": "US"
          },
          "name": {
            "type": "string",
            "description": "Name of the institution, for display. Two banks can share a name\nwhen the same institution offers both a first- and a third-party bank —\n`party` is what separates them, and `bank` is what selects one.",
            "example": "Portage Bank"
          },
          "party": {
            "$ref": "#/components/schemas/VirtualBankParty",
            "description": "Who may pay into the account: `third_party` accepts a payment from\nanyone, including the account holder, while `first_party` accepts\nonly the holder's own and rejects a payment from anyone else."
          }
        }
      },
      "VirtualAccountBankEntry": {
        "type": "object",
        "description": "One bank a virtual account can be opened at.",
        "required": [
          "bank",
          "name",
          "country",
          "party"
        ],
        "properties": {
          "bank": {
            "type": "string",
            "description": "Identifier for the bank. This is the value to send as `bank` when\ncreating a virtual account.",
            "example": "PORTAGE_BANK"
          },
          "country": {
            "type": "string",
            "description": "ISO 3166-1 alpha-2 country an account at this bank is domiciled in.",
            "example": "US"
          },
          "name": {
            "type": "string",
            "description": "Name of the institution, for display. Two entries can share a name\nwhen the same institution offers both a first- and a third-party bank —\n`party` is what separates them, and `bank` is what selects one.",
            "example": "Portage Bank"
          },
          "party": {
            "$ref": "#/components/schemas/VirtualBankParty",
            "description": "Who may pay into the account: `third_party` accepts a payment from\nanyone, including the account holder, while `first_party` accepts\nonly the holder's own and rejects a payment from anyone else."
          }
        }
      },
      "VirtualAccountBanksResponse": {
        "type": "object",
        "required": [
          "banks"
        ],
        "properties": {
          "banks": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/VirtualAccountBank"
            }
          }
        }
      },
      "VirtualBankParty": {
        "type": "string",
        "description": "Who may pay into a bank's virtual accounts.\n\n`third_party` accepts a payment from anyone, including the account\nholder. `first_party` accepts only the holder's own payment and rejects a\npayment from anyone else, so third party is a superset of first party.",
        "enum": [
          "third_party",
          "first_party"
        ]
      }
    },
    "securitySchemes": {
      "api_key": {
        "type": "apiKey",
        "in": "header",
        "name": "Api-Key",
        "description": "Org API key."
      }
    }
  },
  "tags": [
    {
      "name": "Quotes",
      "description": "Price a trade across every eligible rail, then accept a quote to turn it into an order."
    },
    {
      "name": "Customers",
      "description": "End customers (individuals and businesses), their KYC/KYB profiles, verification lifecycle, and supporting documents."
    },
    {
      "name": "Orders",
      "description": "Orders created by accepting a quote: id-based reads and cancellation."
    },
    {
      "name": "Accounts",
      "description": "Fiat and crypto accounts — virtual (Seismic provisions them) or external (you register them) — plus balances and deposits."
    },
    {
      "name": "Reference data",
      "description": "Unauthenticated catalogs: currencies, rails, schemas, industries, banks, and mid-market rates."
    },
    {
      "name": "Organization",
      "description": "Settings of the organization the credential is scoped to."
    }
  ]
}