{ "components": { "parameters": { "WorkspaceId": { "description": "The workspace the request acts in. An API key bound to a workspace implies it: omit the header, or send that same id (another id answers 403 WORKSPACE_SCOPE_MISMATCH). A member session must send it (400 MISSING_WORKSPACE without it).", "in": "header", "name": "X-Workspace-Id", "required": false, "schema": { "format": "uuid", "type": "string" } } }, "schemas": { "AccountKycStatusResponse": { "description": "Response for account-level KYC status (keyed by user_id, not wallet address).", "properties": { "attestationExpiry": { "format": "int64", "minimum": 0, "type": [ "integer", "null" ] }, "blockers": { "description": "Why the account does not admit trading, each with its unlock step.\nEmpty when `is_compliant` is true; never a bare `false`.", "items": { "$ref": "#/components/schemas/CapabilityBlocker" }, "type": "array" }, "documentCountry": { "type": [ "string", "null" ] }, "isCompliant": { "description": "Whether the account itself admits trading: true exactly when\n`blockers` is empty. It is the verdict the trading capabilities\n(`request_quotes`, `submit_order`) apply to the acting account (its own\nKYC standing, a sanctions match, its name screening), so it never\ndisagrees with them. Workspace facts (KYB, role) live in the workspace\ncapability response; settlement-wallet attestation in `wallets`.", "type": "boolean" }, "jurisdiction": { "type": [ "string", "null" ] }, "kycStatus": { "type": "string" }, "kycVerified": { "type": "boolean" }, "nationality": { "type": [ "string", "null" ] }, "residenceCountry": { "type": [ "string", "null" ] }, "riskLabels": { "items": { "type": "string" }, "type": "array" }, "tier": { "type": [ "string", "null" ] }, "wallets": { "description": "Linked wallets and their ACE identity-registration status.", "items": { "$ref": "#/components/schemas/WalletAttestationEntry" }, "type": "array" } }, "required": [ "kycStatus", "kycVerified", "isCompliant", "blockers", "wallets" ], "type": "object" }, "AccountReadiness": { "description": "The acting member's own verification: identity verification (kycStatus), verified wallet count and name screening. For an API key, the member who owns the key.", "properties": { "kycStatus": { "type": "string" }, "sanctionsScreening": { "$ref": "#/components/schemas/SanctionsScreeningState" }, "walletVerifiedCount": { "minimum": 0, "type": "integer" } }, "required": [ "kycStatus", "walletVerifiedCount", "sanctionsScreening" ], "type": "object" }, "AceAttestationProof": { "description": "ACE (Attested Compliance Engine) attestation reference: the on-chain\nrecord that the originator counterparty passed KYC at a given tier in\na given jurisdiction, with the vendor payload hash bound into the\nattestation.", "properties": { "expiresAt": { "description": "Attestation expiry.", "format": "date-time", "type": [ "string", "null" ] }, "jurisdiction": { "description": "ISO 3166-1 alpha-2 jurisdiction the attestation asserts.", "type": [ "string", "null" ] }, "onChainAttested": { "description": "Whether the attestation is committed on-chain.", "type": "boolean" }, "onChainTxHash": { "description": "Transaction hash of the on-chain attestation commit.", "type": [ "string", "null" ] }, "tier": { "description": "Attested compliance tier.", "format": "int32", "type": [ "integer", "null" ] }, "vendorHash": { "description": "Hex hash of the KYC vendor payload bound into the attestation.", "type": [ "string", "null" ] } }, "required": [ "onChainAttested" ], "type": "object" }, "AcePolicyGate": { "description": "How the ACE engine treated the call at the moment a policy run completed.\n\n`PolicyEngine.run` emits the SAME `PolicyRunComplete`, with the same\nfields, whether (a) the policy chain was EMPTY and the target default\nallowed, (b) a policy returned `Allowed`, or (c) every policy returned\n`Continue` and the default allowed. So the event proves the target was\nattached, `run` was called, and the call was not rejected — it does NOT\nprove that any policy evaluated anything. Without this field the three\ncollapse onto one \"a policy run exists\" label, and a fail-open gate reads\nas screened.\n\nThe vocabulary is deliberately the one the router provisioner already uses\nfor the same question (`workspace_routers::onchain::AceEntryGate`), minus\n`Refused`: a refused call reverts and emits no `PolicyRunComplete`, so it\nis structurally impossible for a RECORDED run and is not representable\nhere by construction.\n\nNew values may be added; treat unknown values as other.", "oneOf": [ { "description": "This many policies ran ahead of an allowing default. Always > 0: zero\npolicies is reported as `open`, which is a different fact.", "properties": { "gate": { "description": "New values may be added; treat unknown values as other.", "enum": [ "enforced" ], "type": "string", "x-extensible-enum": true }, "policies": { "format": "int32", "minimum": 0, "type": "integer" } }, "required": [ "policies", "gate" ], "type": "object" }, { "description": "The engine's policy chain for this `(target, selector)` was EMPTY at\nthe run's block and the run completed, so the default allowed it: the\ncall passed UNCHECKED. Never counts as coverage.", "properties": { "gate": { "description": "New values may be added; treat unknown values as other.", "enum": [ "open" ], "type": "string", "x-extensible-enum": true } }, "required": [ "gate" ], "type": "object" }, { "description": "The posture could not be established. Its own class on purpose — it is\nneither evidence of screening nor evidence of its absence, and folding\nit either way states something the ledger does not know.", "properties": { "gate": { "description": "New values may be added; treat unknown values as other.", "enum": [ "unknown" ], "type": "string", "x-extensible-enum": true }, "reason": { "type": "string" } }, "required": [ "reason", "gate" ], "type": "object" } ], "x-extensible-enum": true }, "AfterPayBy_String": { "allOf": [ { "$ref": "#/components/schemas/LateFunds" }, { "properties": { "source": { "type": "string" } }, "required": [ "source" ], "type": "object" } ], "description": "One family serves owned wire values and borrowed catalogue declarations." }, "AmountUnresolved": { "description": "Why a side carries no decimal amount. Present exactly when `decimalAmount`\nis absent, so an unresolved side is a named state and never a guessed or\nmissing number.\n\nNew values may be added; treat unknown values as other.", "enum": [ "assetNotInRegistry", "amountUnavailable" ], "type": "string", "x-extensible-enum": true }, "ApiError": { "description": "A refusal of an integrator operation. Codes are an open set: a client handles the codes it\nknows and falls back on the HTTP status for any other.", "properties": { "details": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/ApiErrorDetails" } ] }, "docUrl": { "description": "Stable documentation for this refusal code.", "type": "string" }, "error": { "description": "The machine-readable code, for example `QUOTE_EXPIRED`.", "type": "string" }, "message": { "description": "What happened, in words a person can read. Not for matching.", "type": "string" }, "next": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/QuoteNextAction", "description": "The way forward, when there is one (for example `requote` on an expired quote)." } ] }, "requestId": { "description": "The request's id, the value the `X-Request-Id` response header carries. Quote it when\nasking for support.", "type": [ "string", "null" ] }, "retryable": { "description": "Whether an unchanged request may succeed later, from the error catalogue.", "type": "boolean" }, "timestamp": { "description": "When the refusal was made, in Unix seconds.", "format": "int64", "type": "integer" } }, "required": [ "error", "docUrl", "retryable", "message", "timestamp" ], "type": "object" }, "ApiErrorDetails": { "additionalProperties": { "description": "Any further detail the code carries (for example `stepUpSubject`, `balanceShortfall`,\n`minimumAmount`), each named in camelCase." }, "description": "The code's detail. Each field is present only on the codes named beside it; other codes may\ncarry further fields, named in camelCase, which a client may ignore.", "properties": { "capabilityBlockers": { "description": "`CAPABILITY_BLOCKED` and the other capability refusals: what blocks the workspace.", "items": { "$ref": "#/components/schemas/CapabilityBlocker" }, "type": [ "array", "null" ] }, "conflicts": { "description": "`REQUOTE_FIELDS_CONFLICT`: the fields that cannot go with `requote`.", "items": { "type": "string" }, "type": [ "array", "null" ] }, "field": { "description": "`INVALID_REQUEST` (out of range): the field.", "type": [ "string", "null" ] }, "reason": { "description": "A machine-readable reason token the refusing step gave.\n\nKnown source reason tokens (not all apply to every status): `adapterPayloadSerializationFailed`, `basicVenueAccountsUnavailable`, `billingPaymentOverdue`, `walletNotOnChain`, `ccxtVenueRequiresCexLane`, `executionStageDisabled`, `jurisdictionUnproven`, `onboardedVenuesUnavailable`, `onchainAccountDefaultWalletRequired`, `onchainAccountDefaultWalletUnavailable`, `onchainAccountWalletRequired`, `onchainAssetDecimalsMismatch`, `onchainAssetIdentityMismatch`, `onchainAssetUnmapped`, `onchainAssetVariantFiltered`, `onchainWalletUnavailable`, `onchainCatalogueUnavailable`, `onchainDeliverToNotReceivingWallet`, `onchainDeliverToUnverified`, `onchainMarketsUnavailable`, `onchainMarketCatalogUnreadable`, `onchainMarketChainRequired`, `onchainMarketVariantRequired`, `onchainMarketTokenRequired`, `onchainSiteChainUnreadable`, `onchainWalletChainUnreadable`, `onchainWalletInactive`, `onchainWalletNotLinked`, `onchainWalletNotUsable`, `onchainWalletPickAmbiguous`, `onchainWalletWrongNetwork`, `signerLacksRight`, `signerUnavailable`, `signingGrantAmbiguous`, `signingGrantExpired`, `signingGrantRequired`, `signingGrantTokenNotKept`, `signingGrantTokenNotPayable`, `solverChainUnready`, `walletChainMismatch`, `walletNotUsableByYou`, `walletNotVerifiedForAce`, `walletNotWhitelisted`, `withdrawalChainUnsupported`, `accountFeeUnavailable`, `comparisonCostsUnavailable`, `connectionListingUnavailable`, `feeUnverified`, `noPool`, `noPrice`, `noSize`, `notFilled`, `notYetPublished`, `priceArithmetic`, `priceSourceNone`, `referenceMidUnavailable`, `settlementPrecisionUnavailable`, `accountSetupIncomplete`, `admissionUnavailable`, `advancedAccountEligibilityUnavailable`, `advancedAccountStateInconsistent`, `advancedConnectionDisabled`, `advancedConnectionNotConfigured`, `advancedConnectionPaused`, `advancedSettlementNeedsVerification`, `advancedModeDisabled`, `advancedNotAvailableForAccount`, `advancedNotEnabledForAccount`, `allowanceUnavailable`, `acrossCapacityExceeded`, `relayCapacityExceeded`, `acrossChainNotCarried`, `cctpChainNotCarried`, `relayChainNotCarried`, `apiKeyAdvancedWalletUnsupported`, `apiKeyOrganisationWalletScopeRequired`, `grantCapExceeded`, `amountAboveMaximum`, `amountBelowMinimum`, `amountUnreadable`, `amountsUnreadable`, `askFirst`, `authorityUnavailable`, `automationNeverAsks`, `availabilityUnreadable`, `backgroundNeverAsks`, `balanceUnreadable`, `defaultsUnavailable`, `walletHasNoAddress`, `walletUnavailable`, `bondAmountUnreadable`, `bondAssetUnreadable`, `catalogueUnavailable`, `chainFamilyUnknown`, `chainUnrecorded`, `clientSessionRequired`, `clockUnreadable`, `comingSoon`, `connectionChanged`, `connectionRevoked`, `corridorInvalid`, `credential`, `deadlineExceeded`, `defaultsLoading`, `deliverToCalldataUnsupported`, `deliverToTagUnsupported`, `deliverToNotPermitted`, `deliverToUnreadable`, `tradingPermissionRequired`, `directPatienceHarvest`, `economicallyInferior`, `exactAmountConflictsWithCard`, `exactAmountConflictsWithQuote`, `exactOutputDeliveryUnsupported`, `exactOutputEstimateUnavailable`, `exactRouteHypothesisUnavailable`, `expiredOnArrival`, `expiryUnknown`, `feeUnreadable`, `filteredOut`, `firmAskRefused`, `freshnessUnknown`, `fundingWindow`, `insufficientLiquidity`, `venueRelationship`, `venueRelationshipUnavailable`, `lpUnknown`, `mfaEnrolmentRequired`, `mfaRequired`, `minimumUnverified`, `mixedNetworks`, `netReceivedUnavailable`, `networkUnrecorded`, `noAddress`, `noCard`, `noFetcher`, `noInventory`, `noLaneForPair`, `noLegs`, `noOnChainCorridor`, `noPlannedVenue`, `noQuote`, `noRpc`, `notConnected`, `notEligible`, `notExecutable`, `orderPayloadMissing`, `outsideTopComposites`, `pairUnmapped`, `sellChainInvalid`, `permissionsUnreadable`, `placeOrderNotPermitted`, `prefundingMarkerUnreadable`, `prefundingRequired`, `indicative`, `priceOnRequest`, `priceOutOfRange`, `priceProtectionInvalid`, `pricingBookOnly`, `productNotQuoted`, `protocolChainMissing`, `providerFeeTreatmentUnknown`, `providerSiteUnrecorded`, `quoteIdUnissuable`, `quoteNotHeld`, `buyChainInvalid`, `buyAmountUnsupported`, `exactOutputDebitUnavailable`, `pairNotServed`, `receiveWalletNotServed`, `referenceMidUnreadable`, `referencePriceUnavailable`, `registryUnavailable`, `releaseRecheckUnavailable`, `requestUnbuildable`, `routeLegChainUnknown`, `routeLegUnnamed`, `routeLegUnplanned`, `routeUnavailable`, `secondFactorUnreadable`, `shortfallUnmeasured`, `shortfallUnreadable`, `singleChainVenue`, `siteChainUnreadable`, `sizeNotEligible`, `submitOrderBlocked`, `takerOnboardingIncomplete`, `tierNotQuoted`, `tradePaused`, `unsupportedNative`, `venueConnectionStorageUnavailable`, `venueDataStale`, `venueDeclined`, `venueNotConnected`, `venueNotEnabledForWorkspace`, `venueNotListed`, `venueTradeKeyUnavailable`, `venueTradeScopeRequired`, `venueTradeUnreadable`, `venueUnavailable`, `walletRefused`, `withdrawalFeeUnread`, `acrossRoutedViaCctp`, `apiKeyOrganisationWalletNotAllowlisted`, `balanceAvailabilityUnconfirmed`, `bankDestinationUnavailable`, `bebopJamKeyNotEnabled`, `bebopJamQuoteDeclined`, `bebopTokenUnavailable`, `relayCurrencyUnsupported`, `relaySwapImpactTooHigh`, `tetrafiSolverCallbackNotAuthorized`, `tradingLinkSnapshotChanged`, `tradingLinkSnapshotUnavailable`, `uniswapChainReadUnavailable`, `uniswapInsufficientDepth`, `uniswapQuoteUnreadable`, `uniswapUnwrapAboveDailyCap`, `uniswapUnwrapAboveTradeCap`, `uniswapRouteNotGranted`, `venueNotEnabled`, `askLimitReached`, `balanceMeaningUnconfirmed`, `bebopJamWalletUnsupported`, `bebopQuorumWalletTooSlow`, `bebopWalletQuorumUnreadable`, `connectionNotConfigured`, `deliveryAccountNetworkUnavailable`, `deliveryAccountUnavailable`, `destinationCannotSendOnChain`, `dexReferencePriceUnavailable`, `firmQuoteLimited`, `fundingAccountNetworkUnavailable`, `fundingAccountUnavailable`, `insufficientDepth`, `missingPermission`, `needsNativeGas`, `needsWallet`, `notPriced`, `payInTermsUnavailable`, `pilotTradeCapExceeded`, `platformFeeRateUnavailable`, `pricingBookPairUnserved`, `settlementDeclarationUnavailable`, `settlementNotAvailable`, `timedOut`, `timedOutBeforeSend`, `tradingSourceNetworkUnavailable`, `tradingSourceNotLinked`, `venueEnablementRechecking`, `venueEnablementUnavailable`, `venueListingTimedOut`, `venuePoliciesUnavailable`.\n\nNew values may be added; treat unknown values as other.", "type": [ "string", "null" ] }, "remediation": { "description": "A machine-readable recovery hint the refusing step gave.", "type": [ "string", "null" ] }, "retryAfter": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/IsoDuration", "description": "Every `429`, and a `503` that knows: when to try again, as an ISO 8601 duration. The\n`Retry-After` header carries the same wait in whole seconds." } ] }, "value": { "description": "`UNKNOWN_ASSET`, `UNKNOWN_CHAIN`, `UNKNOWN_VENUE`, `INVALID_AMOUNT`: the value refused;\n`ASSET_NOT_ON_CHAIN`: the pinned chain the Asset is not on.", "type": [ "string", "null" ] } }, "type": "object" }, "ApprovalStatus": { "description": "Status of a KYB review: pending, under_review, approved, rejected or expired.\n\nNew values may be added; treat unknown values as other.", "enum": [ "pending", "under_review", "approved", "rejected", "expired" ], "type": "string", "x-extensible-enum": true }, "AssetAmountDisplay": { "description": "Raw and normalized amount for one asset side.", "properties": { "asset": { "$ref": "#/components/schemas/AssetDisplay" }, "decimalAmount": { "type": [ "string", "null" ] }, "rawAmount": { "type": [ "string", "null" ] }, "unresolved": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/AmountUnresolved", "description": "Why `decimalAmount` is absent; absent whenever it is present." } ] } }, "required": [ "asset" ], "type": "object" }, "AssetDeploymentEntry": { "description": "One on-chain deployment of an asset variant, identified by its CAIP-2 chain and token decimals.", "properties": { "chain": { "type": "string" }, "decimals": { "format": "int32", "minimum": 0, "type": "integer" } }, "required": [ "chain", "decimals" ], "type": "object" }, "AssetDisplay": { "description": "Display identity for one token/asset.", "properties": { "address": { "type": [ "string", "null" ] }, "assetId": { "type": "string" }, "chainId": { "format": "int64", "minimum": 0, "type": [ "integer", "null" ] }, "chainRef": { "type": [ "string", "null" ] }, "decimals": { "format": "int32", "minimum": 0, "type": [ "integer", "null" ] }, "name": { "type": [ "string", "null" ] }, "resolutionStatus": { "$ref": "#/components/schemas/AssetResolutionStatus" }, "symbol": { "type": "string" } }, "required": [ "assetId", "symbol", "resolutionStatus" ], "type": "object" }, "AssetEntry": { "description": "One Asset the workspace can reach.", "properties": { "assetId": { "type": "string" }, "kind": { "$ref": "#/components/schemas/AssetKind" }, "name": { "type": [ "string", "null" ] }, "symbol": { "type": "string" }, "variants": { "items": { "$ref": "#/components/schemas/AssetVariantEntry" }, "type": "array" } }, "required": [ "assetId", "symbol", "kind", "variants" ], "type": "object" }, "AssetId": { "description": "A registry Asset id (`USDC`, `USDe`). Matched case-insensitively against the catalogue,\nwhich answers it in the registry's own spelling.", "example": "USDC", "type": "string" }, "AssetKind": { "description": "Classification of an asset registered in the deployment registry: `stablecoin`,\n`crypto` or `fiat`. It decides which side of a pair is the stablecoin and which\nis the crypto base.\n\nNew values may be added; treat unknown values as other.", "enum": [ "stablecoin", "crypto", "fiat", "equity", "commodity", "rwa", "index" ], "type": "string", "x-extensible-enum": true }, "AssetResolutionStatus": { "description": "Whether the backend resolved the asset to known display metadata.\n\nNew values may be added; treat unknown values as other.", "enum": [ "resolved", "unknown" ], "type": "string", "x-extensible-enum": true }, "AssetVariant": { "description": "A deployment's variant label: its kind and the name people see (`USDC.e`, `USDT0`,\n`mUSDC`).", "properties": { "kind": { "$ref": "#/components/schemas/VariantKind" }, "name": { "type": "string" } }, "required": [ "kind", "name" ], "type": "object" }, "AssetVariantEntry": { "description": "One variant of an Asset the workspace can reach.", "properties": { "deployments": { "items": { "$ref": "#/components/schemas/AssetDeploymentEntry" }, "type": "array" }, "kind": { "$ref": "#/components/schemas/VariantKind" }, "name": { "type": "string" }, "offChainVenues": { "items": { "type": "string" }, "type": "array" } }, "required": [ "kind", "name", "deployments", "offChainVenues" ], "type": "object" }, "AssetsEligibility": { "description": "Whether the listing is complete for the workspace.", "properties": { "complete": { "type": "boolean" }, "reason": { "description": "Present only when `complete` is false: `ONBOARDED_VENUES_UNAVAILABLE` or\n`ONCHAIN_MARKETS_UNAVAILABLE`.", "type": [ "string", "null" ] } }, "required": [ "complete" ], "type": "object" }, "AssetsRegistry": { "description": "The registry snapshot a response was built from.", "properties": { "snapshotHash": { "type": "string" }, "version": { "format": "int64", "type": "integer" } }, "required": [ "version", "snapshotHash" ], "type": "object" }, "AssetsResponse": { "description": "Assets available to the current workspace, with registry provenance and listing completeness.", "properties": { "assets": { "items": { "$ref": "#/components/schemas/AssetEntry" }, "type": "array" }, "eligibility": { "$ref": "#/components/schemas/AssetsEligibility" }, "nextCursor": { "description": "On a paged request (`limit` or `cursor`), the cursor of the next page; absent on the last\npage and on an unpaged request.", "type": [ "string", "null" ] }, "registry": { "$ref": "#/components/schemas/AssetsRegistry" } }, "required": [ "registry", "eligibility", "assets" ], "type": "object" }, "AssumedWindowBoundary": { "description": "The assumption a window's boundary rests on: the zone whose calendar day (or local time)\nthe boundary assumes, the decision that set it, and the LP whose answer replaces it.", "properties": { "lpName": { "type": "string" }, "source": { "type": "string" }, "timeZone": { "type": "string" } }, "required": [ "timeZone", "source", "lpName" ], "type": "object" }, "AttestationStatus": { "description": "ACE identity-registration status for a linked wallet.\n\nNew values may be added; treat unknown values as other.", "enum": [ "none", "pending", "attested", "expired", "failed" ], "type": "string", "x-extensible-enum": true }, "BankAccountSuffix": { "description": "An already-qualified masked account suffix of 1 to 4 ASCII letters/digits, not external account ownership proof. Never truncate a full account number.", "examples": [ "A1b2" ], "maxLength": 4, "minLength": 1, "pattern": "^[A-Za-z0-9]{1,4}$", "type": "string" }, "BankFundingRevealRef": { "description": "Non-bearer lookup metadata for deposit instructions. Possession grants no authority. Each reveal requires current wallet-view authority and exact account membership; an API key additionally needs treasury_read. Missing and foreign accounts share a refusal. Quotes never fetch these instructions.", "properties": { "connectionId": { "description": "The native held leg's exact connection id, never a first/sole-connection guess.", "type": "string" }, "currency": { "type": "string" }, "providerBankId": { "description": "The provider's linked-bank id when required by that venue; otherwise unknown/null.", "type": [ "string", "null" ] } }, "required": [ "connectionId", "currency", "providerBankId" ], "type": "object" }, "BindingDestinationKind": { "description": "What a payee destination target is. Own financial accounts are not targets\nof this defaults store.\n\nNew values may be added; treat unknown values as other.", "enum": [ "cryptoAddress", "bankAccount" ], "type": "string", "x-extensible-enum": true }, "BindingTargetKind": { "description": "Native wallet/default targets. Trading venue accounts and funding links use\nthe financial-account source model, never this wallet preference namespace.\n\nNew values may be added; treat unknown values as other.", "enum": [ "linkedWallet", "workspaceWallet", "organizationWallet", "destination" ], "type": "string", "x-extensible-enum": true }, "BindingTargetOwnership": { "description": "Native target ownership for selection guidance only, never authorization.\nA destination describes its address-book record, not ownership of external\nfunds or signing authority. Unknown owner facts must stay distinguishable.\n\nNew values may be added; treat unknown values as other.", "enum": [ "personal", "workspace", "unknown" ], "type": "string", "x-extensible-enum": true }, "BindingTargetView": { "description": "The one target object of every read: slot reads, candidates and API-key\n`bindingDefaults`. `address` and `label` are `null` where none;\n`chains` is `[]` for a bank destination.", "properties": { "address": { "type": [ "string", "null" ] }, "chains": { "items": { "type": "string" }, "type": "array" }, "destinationKind": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/BindingDestinationKind", "description": "Present on a `destination` target only." } ] }, "id": { "type": "string" }, "kind": { "$ref": "#/components/schemas/BindingTargetKind" }, "label": { "type": [ "string", "null" ] }, "ownership": { "$ref": "#/components/schemas/BindingTargetOwnership" } }, "required": [ "kind", "id", "ownership", "address", "chains", "label" ], "type": "object" }, "BondReservation": { "description": "The hub bond reservation backing a bonded RFQ order.", "properties": { "amount": { "description": "Reserve amount in hub-asset BASE UNITS (decimal string). Convert for\ndisplay with `decimals` — e.g. `\"40000\"` with `decimals: 6` is 0.04.", "type": "string" }, "assetSymbol": { "description": "Hub bond asset symbol (e.g. `USDC`). OMITTED when the order's marker\npredates the server-authoritative descriptor — never fabricated: a\nconsumer must not render `amount` as a human quantity without it.", "type": [ "string", "null" ] }, "chainId": { "description": "Hub chain id the bond is held on. OMITTED when unknown.", "format": "int64", "minimum": 0, "type": [ "integer", "null" ] }, "decimals": { "description": "Hub bond asset decimals. OMITTED (never defaulted to 0) when unknown.", "format": "int32", "minimum": 0, "type": [ "integer", "null" ] }, "paidAmount": { "description": "Hub-asset BASE UNITS the hub ACTUALLY transferred to the taker on a slash\n(`SolverSlashed.paid`). `amount` is what was RESERVED and is NOT the same\nnumber when the solver's bond had fallen below its reservations — the hub\npays `min(reserved, bonded)`. Emitted ONLY with `status: slashed`, and only\nonce the backend has decoded the slash; absent on legacy markers, where a\nconsumer must stay amount-free rather than quoting `amount`.", "type": [ "string", "null" ] }, "reason": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/BondUnbondableReason", "description": "Why the order was never bond-eligible. Emitted ONLY with\n`status: notEligible`; omitted for every other status, so a consumer that\npredates this field sees a byte-identical payload on the paths it knows." } ] }, "status": { "$ref": "#/components/schemas/BondReservationStatus", "description": "Current reserve lifecycle status." }, "txHash": { "description": "The `reportTerminal` / `redispatchBound` tx hash, once the backend has\ndriven a terminal attestation. Absent while `pending`/`reserved`.", "type": [ "string", "null" ] } }, "required": [ "status", "amount" ], "type": "object" }, "BondReservationStatus": { "description": "Lifecycle status of a bonded RFQ order's hub reserve.\n\nNew values may be added; treat unknown values as other.", "enum": [ "pending", "reserved", "released", "slashed", "unbonded", "notEligible", "expired" ], "type": "string", "x-extensible-enum": true }, "BondUnbondableReason": { "description": "Why an order was never bond-ELIGIBLE: there is no EVM address the hub could pay\ncompensation to (`crossVmCarrier`, `routerCloneBeneficiary`), or the solver's bond\nhad no free capacity when the order opened (`insufficientFreeBond`).\nPresent only when the bond status is `notEligible`.\n\nNew values may be added; treat unknown values as other.", "enum": [ "crossVmCarrier", "routerCloneBeneficiary", "insufficientFreeBond" ], "type": "string", "x-extensible-enum": true }, "BridgeRelayMode": { "description": "Who relays the destination-chain mint once the bridge attestation\nis available.\n\nNew values may be added; treat unknown values as other.", "enum": [ "circleForwarding", "selfRelay" ], "type": "string", "x-extensible-enum": true }, "BridgeTransferMode": { "description": "Bridge speed/finality mode. Fast modes typically cost a higher\nprotocol fee and settle in seconds; standard modes wait for hard\nfinality. Forwarding fees apply independently to both.\n\nNew values may be added; treat unknown values as other.", "enum": [ "fast", "standard" ], "type": "string", "x-extensible-enum": true }, "Caip2Chain": { "description": "A CAIP-2 chain id (`eip155:8453`, `solana:`, `tron:shasta`), syntax-checked:\na namespace of 3 to 8 lowercase letters, digits or `-`, and a reference of 1 to 32\nletters, digits, `-` or `_`. Compared exactly, as CAIP-2 references are case-sensitive.", "example": "eip155:8453", "type": "string" }, "CaipNamespace": { "description": "CAIP namespace encoded in the EIP-7930 `chainType` field.\n\nNew values may be added; treat unknown values as other.", "enum": [ "eip155", "solana", "cosmos" ], "type": "string", "x-extensible-enum": true }, "CandidateBalance": { "description": "A candidate's balance of the pay Asset, tagged `kind`. A cold or\nfailed read is `unavailable`, never 0. `variant` names the token the\nbalance was read in (an Octarine route pays mUSDC, a variant of the requested USDC).\n\nNew values may be added; treat unknown values as other.", "discriminator": { "propertyName": "kind" }, "oneOf": [ { "properties": { "amount": { "$ref": "#/components/schemas/DecimalAmount" }, "asset": { "$ref": "#/components/schemas/AssetId" }, "kind": { "description": "New values may be added; treat unknown values as other.", "enum": [ "known" ], "type": "string", "x-extensible-enum": true }, "variant": { "$ref": "#/components/schemas/AssetVariant", "description": "The pay deployment's variant whose token balance this is." } }, "required": [ "amount", "asset", "variant", "kind" ], "type": "object" }, { "properties": { "kind": { "description": "New values may be added; treat unknown values as other.", "enum": [ "unavailable" ], "type": "string", "x-extensible-enum": true }, "reason": { "description": "A camelCase token naming why (`notWarmed`).", "type": "string" } }, "required": [ "reason", "kind" ], "type": "object" } ], "x-extensible-enum": true }, "CapabilityBlocker": { "description": "One reason a capability is blocked, plus the step that unlocks it.", "properties": { "code": { "$ref": "#/components/schemas/CapabilityBlockerCode" }, "currentlyDue": { "description": "Requirement keys still due, such as `kyb_review`, `actor_kyc` or\n`permission:place_order`. Empty when nothing specific is due.", "items": { "type": "string" }, "type": "array" }, "estimate": { "$ref": "#/components/schemas/CapabilityUnlockEstimate" }, "message": { "type": "string" }, "unlockStep": { "$ref": "#/components/schemas/CapabilityUnlockStep", "description": "Stable key of the step that unlocks this blocker. The UI maps it to a\nroute or dialog." } }, "required": [ "code", "message", "unlockStep", "estimate" ], "type": "object" }, "CapabilityBlockerCode": { "description": "Stable machine-readable blocker codes returned by the capability gate.\n\nNew values may be added; treat unknown values as other.", "enum": [ "WORKSPACE_NOT_FOUND", "WORKSPACE_NOT_ACTIVE", "WORKSPACE_SUSPENDED", "PARENT_WORKSPACE_INACTIVE", "INSUFFICIENT_PERMISSION", "WORKSPACE_TYPE_UNSUPPORTED", "BASE_PROFILE_INCOMPLETE", "BASE_PROFILE_UNREADABLE", "KYB_NOT_VERIFIED", "KYC_NOT_VERIFIED", "SANCTIONS_FLAGGED", "MEMBER_COMPLIANCE_FROZEN", "MEMBER_COMPLIANCE_DENIED", "SCREENING_PENDING", "SCREENING_UNAVAILABLE", "GEO_RESTRICTED", "WALLET_NOT_VERIFIED", "DIRECT_USER_NOT_FOUND", "DIRECT_USER_SUSPENDED", "DIRECT_USER_KYC_NOT_VERIFIED", "INSUFFICIENT_SCOPE", "TREASURY_DISABLED", "NO_USABLE_CREDENTIAL", "CROSS_OWNER_WRITE_DENIED", "AGGREGATE_SCOPE_READ_ONLY", "OWNER_SCOPE_REQUIRED", "VENUE_OPERATION_UNSUPPORTED", "TAKER_ONBOARDING_INCOMPLETE", "TAKER_ADMISSION_UNAVAILABLE" ], "type": "string", "x-extensible-enum": true }, "CapabilityDecision": { "description": "Evaluation result for one capability.", "properties": { "allowed": { "type": "boolean" }, "blockers": { "items": { "$ref": "#/components/schemas/CapabilityBlocker" }, "type": "array" } }, "required": [ "allowed" ], "type": "object" }, "CapabilityFreshness": { "description": "New values may be added; treat unknown values as other.", "enum": [ "current", "expired", "revision_changed" ], "type": "string", "x-extensible-enum": true }, "CapabilityState": { "description": "New values may be added; treat unknown values as other.", "enum": [ "supported", "unsupported", "unverified", "stale", "unavailable" ], "type": "string", "x-extensible-enum": true }, "CapabilityUnlockEstimate": { "description": "Coarse time-to-unlock class. The UI owns the copy; figures are engineering\nestimates until the KYB queue and Sumsub webhooks supply measured values.\n\nNew values may be added; treat unknown values as other.", "enum": [ "minutes", "forms_then_review", "admin_action", "other_party", "unknown", "not_unlockable" ], "type": "string", "x-extensible-enum": true }, "CapabilityUnlockStep": { "description": "Stable key for the step that unlocks a blocked capability. The backend\nnames the step; the UI owns the step-to-route map. Never a UI route.\n\nNew values may be added; treat unknown values as other.", "enum": [ "finish_onboarding", "company_details", "kyb_profile", "kyc_dialog", "link_wallet", "ask_admin", "contact_broker", "manage_direct_users", "manage_api_key", "connect_custodian", "switch_account_scope", "contact_support", "await_screening", "none" ], "type": "string", "x-extensible-enum": true }, "CardFirmness": { "description": "How firm a card's price is, read with `expiresAt`: `firm: true` delivers exactly\n`buy.amount` until `expiresAt`; `firm: false` with `expiresAt` executes held to `minOut`;\n`firm: false` with `expiresAt` null is indicative (it lapses at `staleAfter`, and is\norderable only through its `next: order`, executed within the caller's minimum receive).", "properties": { "firm": { "description": "Whether the venue is bound to this price until `expiresAt`.", "type": "boolean" }, "lastLook": { "description": "Always false: no venue re-checks an accepted price before it fills, so an order inside\n`expiresAt` on a firm card trades at it or is refused unsent.", "type": "boolean" } }, "required": [ "firm", "lastLook" ], "type": "object" }, "CatalogueVenueKind": { "description": "A Venue's kind: where its money sits. Each Venue declares its kind in the\nvenue-desk catalogue (`catalogue::Venue.kind`), which re-exports this type.\nPublished as `CatalogueVenueKind`: the `VenueKind` component is the solver\nclassifier (`solvers::VenueKind`, solver-operated or direct venue).\n\nNew values may be added; treat unknown values as other.", "enum": [ "accountBased", "walletBased" ], "type": "string", "x-extensible-enum": true }, "CexDepositConfirmation": { "properties": { "forwardTransaction": { "$ref": "#/components/schemas/OrderTransactionInfo", "description": "Spoke DDR v2 RoutedDepositForwarded transaction, never the CCIP dispatch." }, "transaction": { "$ref": "#/components/schemas/OrderTransactionInfo", "description": "Hub transaction that emitted DepositConfirmed." }, "venueDepositId": { "type": "string" }, "venueTxHash": { "description": "Venue evidence only; never a chain explorer reference.", "type": "string" } }, "required": [ "transaction", "forwardTransaction", "venueDepositId", "venueTxHash" ], "type": "object" }, "CexDepositSettlement": { "properties": { "accountAssetKey": { "type": "string" }, "amount": { "type": "string" }, "applicationTransaction": { "$ref": "#/components/schemas/OrderTransactionInfo" }, "confirmation": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/CexDepositConfirmation" } ] }, "depositKey": { "type": "string" }, "ledger": { "type": "string" } }, "required": [ "depositKey", "accountAssetKey", "ledger", "amount", "applicationTransaction" ], "type": "object" }, "CexLaneSettlement": { "properties": { "deposits": { "items": { "$ref": "#/components/schemas/CexDepositSettlement" }, "type": "array" }, "tradeFills": { "items": { "$ref": "#/components/schemas/CexTradeFillSettlement" }, "type": "array" } }, "required": [ "tradeFills", "deposits" ], "type": "object" }, "CexTradeFillSettlement": { "properties": { "actualInputAmount": { "type": "string" }, "actualOutputAmount": { "type": "string" }, "evidenceHash": { "type": "string" }, "ledger": { "type": "string" }, "tradeId": { "type": "string" }, "transaction": { "$ref": "#/components/schemas/OrderTransactionInfo" }, "venueFillId": { "type": "string" } }, "required": [ "tradeId", "ledger", "transaction", "venueFillId", "evidenceHash", "actualInputAmount", "actualOutputAmount" ], "type": "object" }, "ChainFamily": { "description": "The family of wallets and addresses a chain uses.\n\nNew values may be added; treat unknown values as other.", "enum": [ "evm", "solana", "tron" ], "type": "string", "x-extensible-enum": true }, "ChainRefV1": { "description": "Canonical, namespace-aware chain identity. EIP-155 references are canonical non-zero decimal strings; Solana references are stable cluster identifiers. Cosmos is accepted by the registry codec but is not a supported DEX execution namespace.", "properties": { "namespace": { "$ref": "#/components/schemas/CaipNamespace" }, "reference": { "type": "string" } }, "required": [ "namespace", "reference" ], "type": "object" }, "CompanyTradeDetail": { "description": "Full trade detail with Sections A-E.", "properties": { "fees": { "$ref": "#/components/schemas/FeesSection", "description": "Fee breakdown: gas, protocol fee, solver fee, relayer tips. Absent\nwhen the order predates fee capture." }, "legs": { "description": "Uniform per-leg execution model for multi-leg route orders; absent for\nsingle-leg escrow / deferred orders. Mirrors `OrderResponse.legs`.", "items": { "$ref": "#/components/schemas/OrderLegInfo" }, "type": [ "array", "null" ] }, "lp": { "$ref": "#/components/schemas/LpInfoSection" }, "orderKind": { "description": "Canonical, route-aware order kind (`cctp-v0` / `composite-v0` / `fx-v0` /\n`escrow-v0` / …). Mirrors `OrderResponse.orderKind`.", "type": [ "string", "null" ] }, "settlement": { "$ref": "#/components/schemas/OnChainSettlementSection" }, "substatus": { "description": "Finer-grained state within the coarse status (route `routeStatus`, etc.).", "type": [ "string", "null" ] }, "substatusMessage": { "description": "Human-readable elaboration of `substatus` — a Circle StableFX status line, or\nthe reason a parked/refunded/recovered order is in that state. Mirrors\n`OrderResponse.substatusMessage`.", "type": [ "string", "null" ] }, "trade": { "$ref": "#/components/schemas/TradeDetailsSection" } }, "required": [ "trade", "settlement", "lp" ], "type": "object" }, "CompanyTradeListItem": { "description": "A single trade in the paginated list view.", "properties": { "actionRequired": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/TradeActionRequired", "description": "Set when the order is waiting on a person rather than on a chain or a solver:\na composite parked until its taker re-quotes and signs the next leg. Its coarse\n`status` still reads `executing`, identical to a leg in flight, so this is the\nonly list field that tells the two apart. Absent for every other order." } ] }, "amountUsd": { "description": "Absent when the order recorded no USD notional; never 0 for an unknown amount.", "format": "double", "type": [ "number", "null" ] }, "apiKey": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/TradeApiKey" } ] }, "channel": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/OrderChannel" } ] }, "createdAt": { "format": "date-time", "type": "string" }, "custodyVaultAddress": { "description": "Custody vault address when the order settled through a custody vault.\nAbsent for self-custody orders.", "type": [ "string", "null" ] }, "deferredSettlement": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/DeferredSettlementInfo" } ] }, "deliveredBuyProvenance": { "description": "Provenance of the delivered buy amount behind `slippage_bps`: `\"measured\"`\nvs `\"quoted\"` (carried forward unmeasured). See the detail section.", "type": [ "string", "null" ] }, "executionPrice": { "$ref": "#/components/schemas/ExecutionPriceDisplay" }, "failureReason": { "description": "Why the order failed or was refunded, as the detail's `settlement.failureReason`\nreports it: absent while the order has no recorded failure.", "type": [ "string", "null" ] }, "lifecycleStatus": { "$ref": "#/components/schemas/TradeLifecycleStatus" }, "linkedWalletId": { "description": "Account-linked wallet id that placed the trade, for per-wallet filtering\nand display. Absent for router-executed or unattributed orders that carry\nno linked wallet.", "type": [ "string", "null" ] }, "lpName": { "type": "string" }, "lpSource": { "type": "string" }, "lpVenueId": { "description": "The catalogue Venue id of the order's LP (`keyrock`, `circle-cctp`; a routed\norder's first leg), so a client draws the LP's logo by identity rather than by\n`lp_name`. Absent when no catalogue Venue declares that LP.", "type": [ "string", "null" ] }, "nextAction": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/NextAction", "description": "The typed form of `actionRequired`: the same decision the order page reads\n(`OrderResponse.nextAction`), computed by the same backend owner. Clients switch on\nits `kind`; `actionRequired` stays for older clients and is derived from it." } ] }, "nextActor": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/NextActor", "description": "Who acts next: the same decision the order read carries." } ] }, "orderId": { "type": "string" }, "orderKind": { "description": "Canonical route-aware order kind (`cctp-v0` / `composite-v0` / `fx-v0` / …)\nfor list clients + API-key parity with the detail. Absent for non-route\norders, where `orderType` suffices.", "type": [ "string", "null" ] }, "route": { "$ref": "#/components/schemas/TradeRouteDisplay" }, "routingPath": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/RoutingPath" } ] }, "routingPathLabel": { "type": "string" }, "settlementSpeedMs": { "format": "int64", "minimum": 0, "type": [ "integer", "null" ] }, "settlementStatus": { "type": "string" }, "slippageBps": { "format": "int64", "type": [ "integer", "null" ] }, "status": { "description": "Canonical user-facing order lifecycle status from `orders.status`.\n`settlement_status` remains the coarse analytics bucket.", "type": "string" }, "submittedByYou": { "description": "The caller submitted this order: the same rule as the order read's\n`viewer.submittedByYou` (the linked wallet's user or the order's user is the caller).\nAlways false for an API-key caller.", "type": "boolean" } }, "required": [ "orderId", "createdAt", "submittedByYou", "route", "lpName", "lpSource", "routingPathLabel", "status", "settlementStatus", "lifecycleStatus", "executionPrice" ], "type": "object" }, "CompanyVenueTradeListItem": { "description": "A venue trade in the one trade history.", "properties": { "amountUsd": { "description": "A reference USD value of what the trade sells, by the same price service that values an\norder row's `amountUsd`, at the price when read. `amountUsdBasis` says which amount it\nvalues. Absent when the asset has no reference price or the price read failed; never 0\nfor an unknown value.", "format": "double", "type": [ "number", "null" ] }, "amountUsdBasis": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/VenueTradeAmountBasis", "description": "`executed` (what the venue debited, on a fill) or `requested` (the most the trade\ncould spend, otherwise). Present exactly when `amountUsd` is." } ] }, "apiKey": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/TradeApiKey" } ] }, "buy": { "$ref": "#/components/schemas/VenueTradeHistoryLeg", "description": "What the trade buys: its asset and, when recorded, the least it must receive from its consented bounds." }, "connectionId": { "type": "string" }, "createdAt": { "format": "date-time", "type": "string" }, "executionPrice": { "description": "Legacy confirmed output per input (buy asset / sell asset), computed with Decimal;\nnull when unread. executionPriceUnit states its unit; prefer statedExecutionPrice for display.", "type": [ "string", "null" ] }, "executionPriceUnit": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/VenueTradePriceUnit" } ] }, "executionStatus": { "$ref": "#/components/schemas/VenueTradeExecutionStatus" }, "executionTypeId": { "description": "The execution type (compiled spec id), not the catalogue Venue.", "type": "string" }, "feesPaid": { "description": "What a confirmed same-asset fill (a bridge) cost the taker: spent minus\nreceived, the venue's protocol and forwarding fees, in the sell asset. Absent unless confirmed and positive.", "type": [ "string", "null" ] }, "financials": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/VenueTradeFinancials", "description": "The trade's recorded money terms and payment legs, from the same records as the order read; history never re-derives a fee or minimum." } ] }, "inputSpent": { "description": "What the venue debited and credited, once its outcome is recorded.", "type": [ "string", "null" ] }, "lifecycleStatus": { "$ref": "#/components/schemas/TradeLifecycleStatus", "description": "The same lifecycle shape an order row carries; `needsReview` is not final." }, "notSentCause": { "description": "The stable code behind `notSentReason`, the same value the venue-trade detail's\n`notSentCause` carries (for example `WALLET_NONCE_PENDING`). A code this version does not\nknow is still named. Absent when no cause was retained.", "type": [ "string", "null" ] }, "notSentReason": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/VenueTradeNotSentReason", "description": "Why a `not_sent` outcome was not sent, as the dispatch's `notSentReason`." } ] }, "operationId": { "type": "string" }, "outcomeCode": { "description": "Why the trade ended as it did, as its dispatch records it (the order page's\n`dispatch.outcomeCode`): the history row names a no-fill's reason from it.\nAbsent until an outcome is recorded.", "type": [ "string", "null" ] }, "outputReceived": { "type": [ "string", "null" ] }, "pair": { "description": "The recorded market pair; absent stays absent, never inferred from asset order.", "type": [ "string", "null" ] }, "placedBy": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/VenueTradePlacedBy", "description": "Who placed the trade: the API key by label, else the member where this reader may see their name. Absent otherwise." } ] }, "providerSite": { "type": "string" }, "sell": { "$ref": "#/components/schemas/VenueTradeHistoryLeg", "description": "What the trade sells: its asset and, when recorded, the most it may spend from its consented bounds." }, "statedExecutionPrice": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/VenueTradeStatedPrice", "description": "QuoteCurrencyPriority market convention, with explicit base/quote and fallback basis." } ] }, "submittedByYou": { "type": "boolean" }, "tetrafiFee": { "description": "Gross TetraFi fee (list rate, before incentives) from the Basic billing ledger, in tetrafiFeeAsset; absent until accrued.", "type": [ "string", "null" ] }, "tetrafiFeeAsset": { "type": [ "string", "null" ] }, "venueAccountName": { "description": "The workspace's venue account it went through, titled by its catalogue Venue\n(\"Keyrock account\"), never by the execution type (\"Keyrock OTC\"); an on-chain venue is\nnever an account and reads as itself (\"Circle StableFX\").", "type": "string" }, "venueName": { "description": "The venue's name, for display.", "type": "string" } }, "required": [ "connectionId", "operationId", "executionTypeId", "venueName", "venueAccountName", "providerSite", "createdAt", "submittedByYou", "sell", "buy", "executionStatus", "lifecycleStatus" ], "type": "object" }, "ComplianceCheckGroup": { "description": "Why a check belongs in a trade's applied, inapplicable or not-run group.\n\nNew values may be added; treat unknown values as other.", "enum": [ "applied", "not_applicable", "not_run" ], "type": "string", "x-extensible-enum": true }, "ComplianceCheckVerdict": { "description": "Verdict of one check.\n\nNew values may be added; treat unknown values as other.", "enum": [ "pass", "fail", "hold", "skipped", "not_applicable", "warned" ], "type": "string", "x-extensible-enum": true }, "ComplianceLayer": { "description": "Where a compliance check was evaluated and where its evidence lives.\n\nNew values may be added; treat unknown values as other.", "enum": [ "onChain", "offChain" ], "type": "string", "x-extensible-enum": true }, "ComplianceRemedy": { "description": "The step available to resolve a recorded order denial.\n\nNew values may be added; treat unknown values as other.", "enum": [ "verifyIdentity", "reverifyIdentityCountry", "provideTravelRuleData", "provideRequiredFields", "waitForLimitReset", "retryLater", "none", "complianceReview" ], "type": "string", "x-extensible-enum": true }, "ComplianceRunMode": { "description": "The mode recorded by this check, never reconstructed from today's policy.\n\nNew values may be added; treat unknown values as other.", "enum": [ "enforce", "warn", "shadow", "off", "unrecorded", "unreadable", "withheld" ], "type": "string", "x-extensible-enum": true }, "ComplianceVerdict": { "description": "Aggregate verdict of the whole pre-trade evaluation for the order.\n\nNew values may be added; treat unknown values as other.", "enum": [ "pass", "fail", "hold", "pending", "not_applicable", "warned" ], "type": "string", "x-extensible-enum": true }, "ContinuationDelegation": { "description": "The delegate grant covering this leg, when one exists.", "properties": { "grantId": { "type": "string" }, "refusal": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/OrderGrantRefusal", "description": "The named refusal when `status` is `refused` (or the reason a non-usable grant cannot sign)." } ] }, "status": { "$ref": "#/components/schemas/ContinuationDelegationStatus" } }, "required": [ "grantId", "status" ], "type": "object" }, "ContinuationDelegationStatus": { "description": "Where a delegate grant for this leg's signature stands. Absent when no order-scoped bounded delegate (a limited grant the owners approved) exists. This observation never grants authority or replaces the grant resource.\n\nNew values may be added; treat unknown values as other.", "enum": [ "preparing", "awaitingApproval", "installing", "installed", "signing", "signed", "refused", "expired", "revoked" ], "type": "string", "x-extensible-enum": true }, "ContinuationLegPlan": { "description": "How one leg of a route runs and what happens if it cannot.", "properties": { "delegation": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/ContinuationDelegation", "description": "A delegate grant covering this leg's signature (phase 3). `mode` stays\n`needsSignature`; the delegate is who provides that signature when it can." } ] }, "etaSeconds": { "description": "Seconds until this leg can run, when the quote measured it.", "format": "int64", "minimum": 0, "type": [ "integer", "null" ] }, "legIndex": { "format": "int32", "minimum": 0, "type": "integer" }, "minimumOutput": { "description": "The lowest output the order accepts for this leg, in base units.", "type": [ "string", "null" ] }, "mode": { "$ref": "#/components/schemas/LegMode" }, "onFailure": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/FundsLocation", "description": "Where the funds wait if this leg does not run. Absent for an atomic leg (nothing\nmoves) and when the route does not record it." } ] }, "referenceOutput": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/AssetAmountDisplay", "description": "The output accepted at quote time for this leg." } ] }, "slippageBps": { "format": "int32", "minimum": 0, "type": "integer" } }, "required": [ "legIndex", "mode", "slippageBps" ], "type": "object" }, "ContinuationPlan": { "description": "How each leg of a multi-leg route runs. One entry per leg that follows another, plus\nleg 0 of an FX-first route, which waits for the taker's signature before anything moves.", "properties": { "legs": { "items": { "$ref": "#/components/schemas/ContinuationLegPlan" }, "type": "array" } }, "required": [ "legs" ], "type": "object" }, "ContinuationRepricingOffer": { "description": "The fresh price a continuation was refused at, left for the taker to accept once.\n\nCarried by the 409 `QUOTE_PRICE_MOVED` body. It binds one attempt of one leg and\nexpires; accepting it rebaselines only that attempt.", "properties": { "acceptedAmount": { "description": "The reference the order held the leg to (the price accepted at quote time, or a\nre-price accepted earlier in this attempt), in base units.", "type": "string" }, "asset": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/AssetDisplay", "description": "The compared asset, when the order records it." } ] }, "attempt": { "description": "The attempt this offer belongs to, numbered as in the order's `legAttempts`.", "format": "int32", "minimum": 0, "type": "integer" }, "boundAmount": { "description": "The bound the fresh value had to meet: `acceptedAmount` widened by the tolerance.", "type": "string" }, "compared": { "$ref": "#/components/schemas/RepricedSide" }, "expiresAt": { "description": "Unix seconds after which the offer can no longer be accepted.", "format": "int64", "type": "integer" }, "freshAmount": { "description": "The fresh value the venue quoted, in base units.", "type": "string" }, "legIndex": { "format": "int32", "minimum": 0, "type": "integer" }, "quoteRef": { "description": "Identifies this offer. Accepting it must name this value.", "type": "string" } }, "required": [ "legIndex", "attempt", "compared", "acceptedAmount", "boundAmount", "freshAmount", "quoteRef", "expiresAt" ], "type": "object" }, "CounterpartyKycStatus": { "description": "KYC workflow status for a counterparty. Besides the usual review states it has\n`renewal_pending` (a verification renewal is due) and `frozen` (the counterparty\nis frozen).\n\nNew values may be added; treat unknown values as other.", "enum": [ "pending", "under_review", "verified", "denied", "expired", "renewal_pending", "frozen" ], "type": "string", "x-extensible-enum": true }, "CreateWebhookRequest": { "description": "Request to create a webhook.", "properties": { "events": { "items": { "type": "string" }, "type": "array" }, "url": { "type": "string" } }, "required": [ "url", "events" ], "type": "object" }, "CreateWebhookResponse": { "description": "Response after creating a webhook. Store the shown-once `whsec_` secret now.\nStandard Webhooks signs `\"..\"` with the decoded\nkey bytes, sending `webhook-signature: v1,`. No legacy headers are sent.", "properties": { "secret": { "description": "Present only on the first response; receipts and replays contain null.", "type": [ "string", "null" ] }, "secretShownOnce": { "description": "True even when the secret has been withheld on replay.", "type": "boolean" }, "webhook": { "$ref": "#/components/schemas/WebhookConfig" } }, "required": [ "webhook", "secret", "secretShownOnce" ], "type": "object" }, "CredentialAuth": { "description": "How the presented credential authenticated.\n\nNew values may be added; treat unknown values as other.", "enum": [ "apiKey", "oauthClientCredentials" ], "type": "string", "x-extensible-enum": true }, "CreditAmount": { "properties": { "amount": { "type": "string" }, "currency": { "type": "string" }, "lineValue": { "type": [ "string", "null" ] } }, "required": [ "amount", "currency" ], "type": "object" }, "CreditCheck": { "description": "Point-in-time credit evidence, never a reservation or dispatch authority.", "properties": { "activeHolds": { "type": "string" }, "available": { "type": "string" }, "availableSigned": { "type": "string" }, "checkedAt": { "format": "date-time", "type": "string" }, "creditPortion": { "$ref": "#/components/schemas/CreditAmount" }, "decision": { "type": "string" }, "effectiveLimit": { "type": "string" }, "exposureDelta": { "type": "string" }, "exposureReducing": { "type": "boolean" }, "journalVersion": { "type": [ "string", "null" ] }, "localHeadroom": { "type": "string" }, "lpAvailable": { "type": "string" }, "maxAgeMs": { "format": "int64", "minimum": 0, "type": "integer" }, "observationAgeMs": { "format": "int64", "minimum": 0, "type": "integer" }, "observationId": { "format": "uuid", "type": "string" }, "overLimitBy": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/CreditAmount" } ] }, "positionsBasis": { "description": "Why the read vouches that an omitted asset holds zero; absent when no asset was omitted.", "type": [ "string", "null" ] }, "projectedUsed": { "type": "string" }, "source": { "type": "string" }, "termsVersion": { "format": "int64", "type": "integer" }, "used": { "type": "string" }, "valuationMaxAgeMs": { "format": "int64", "minimum": 0, "type": "integer" }, "venueAccountId": { "format": "uuid", "type": "string" }, "zeroAssets": { "description": "Assets the LP's positions read omitted and that this decision counted as zero.", "items": { "type": "string" }, "type": "array" } }, "required": [ "decision", "venueAccountId", "observationId", "termsVersion", "checkedAt", "maxAgeMs", "valuationMaxAgeMs", "observationAgeMs", "lpAvailable", "effectiveLimit", "used", "localHeadroom", "activeHolds", "available", "availableSigned", "projectedUsed", "exposureDelta", "creditPortion", "exposureReducing", "source" ], "type": "object" }, "CreditReservation": { "description": "A firm ask's combined hold on a credit account: the positives the trade spends\n(debit-asset units) and the credit exposure it may add (line currency), admitted together\nunder the account lock. Held until the quote expires or Confirm adopts it; an indicative\ncard never carries one. Neither a dispatch authority nor a consent.", "properties": { "debitAsset": { "type": "string" }, "expiresAt": { "description": "When the unsent hold is released: the quote's own expiry.", "format": "date-time", "type": "string" }, "exposureAmount": { "description": "The credit exposure the trade may add, in the line currency, rounded up.", "type": "string" }, "exposureCurrency": { "type": "string" }, "inputAmount": { "description": "The trade's full debit, exact.", "type": "string" }, "operationId": { "description": "The prepared trade the ask was made for, when it was.", "format": "uuid", "type": [ "string", "null" ] }, "positiveInputAmount": { "description": "The part of the debit spent from positives, in the debit asset, rounded up.", "type": "string" }, "reservationId": { "format": "uuid", "type": "string" }, "state": { "description": "`reserved` while unsent; `released` once it expired, was adopted or was superseded.", "type": "string" } }, "required": [ "reservationId", "debitAsset", "inputAmount", "positiveInputAmount", "exposureAmount", "exposureCurrency", "expiresAt", "state" ], "type": "object" }, "DayBasis": { "description": "A settlement schedule's day basis.\n\nNew values may be added; treat unknown values as other.", "enum": [ "calendarDays", "businessDays" ], "type": "string", "x-extensible-enum": true }, "DecimalAmount": { "description": "A non-negative decimal string in Asset units (`\"10000\"`, `\"9994.0\"`): digits with an\noptional fraction, no sign, exponent or leading zero. Never a float and never base\nunits. A request amount must also be positive (`INVALID_AMOUNT`); a fee or a\nknown balance may be zero.", "example": "10000", "type": "string" }, "DeferredSettlementInfo": { "description": "Deferred LP settlement/withdrawal tracking that is separate from the\norder's primary execution status. A deferred order can be `Executed` while\nthis object still reports a settlement window or withdrawal state.", "properties": { "autoWithdraw": { "type": "boolean" }, "estimatedSettlementAvailableAt": { "format": "date-time", "type": [ "string", "null" ] }, "executedAt": { "format": "date-time", "type": [ "string", "null" ] }, "settlementWindowHours": { "format": "int32", "minimum": 0, "type": [ "integer", "null" ] }, "stage": { "type": "string" }, "withdrawalStatus": { "type": [ "string", "null" ] }, "withdrawalTrackingId": { "type": [ "string", "null" ] }, "withdrawalTxHash": { "type": [ "string", "null" ] } }, "required": [ "stage", "autoWithdraw" ], "type": "object" }, "DeliverTo": { "description": "Output to own money (a financial account) or an explicit chain address.\n\nNew values may be added; treat unknown values as other.", "discriminator": { "propertyName": "kind" }, "oneOf": [ { "additionalProperties": false, "properties": { "financialAccountId": { "type": "string" }, "kind": { "description": "New values may be added; treat unknown values as other.", "enum": [ "financialAccount" ], "type": "string", "x-extensible-enum": true } }, "required": [ "financialAccountId", "kind" ], "type": "object" }, { "additionalProperties": false, "properties": { "address": { "type": "string" }, "calldata": { "type": [ "string", "null" ] }, "chain": { "$ref": "#/components/schemas/Caip2Chain" }, "destinationTag": { "type": [ "string", "null" ] }, "kind": { "description": "New values may be added; treat unknown values as other.", "enum": [ "address" ], "type": "string", "x-extensible-enum": true } }, "required": [ "chain", "address", "kind" ], "type": "object" } ], "x-extensible-enum": true }, "ExecutionPriceDisplay": { "description": "User-facing execution price for a read model.", "properties": { "baseSymbol": { "type": [ "string", "null" ] }, "quoteSymbol": { "type": [ "string", "null" ] }, "source": { "$ref": "#/components/schemas/ExecutionPriceSource" }, "value": { "type": [ "string", "null" ] } }, "required": [ "source" ], "type": "object" }, "ExecutionPriceSource": { "description": "Source used for the execution price exposed by read-model APIs.\n\nNew values may be added; treat unknown values as other.", "enum": [ "stored_quote_price", "derived_from_amounts", "unavailable" ], "type": "string", "x-extensible-enum": true }, "FeeLineKind": { "description": "New values may be added; treat unknown values as other.", "enum": [ "provider", "platform", "integrator", "bank", "network" ], "type": "string", "x-extensible-enum": true }, "FeePayer": { "description": "Who bears a fee line. Sponsored relayer gas on a delegated lane is a `network` line\npaid by the `platform`.\n\nNew values may be added; treat unknown values as other.", "enum": [ "taker", "platform", "takerStatement" ], "type": "string", "x-extensible-enum": true }, "FeeTotals": { "properties": { "lpSpreadUsd": { "description": "LP spread charged to the taker (the `lp_spread` fee_kind). Previously this\nwas miscounted into `user_gas_usd` and displayed as \"User Gas\"; it is a\npricing spread, not gas.", "format": "double", "type": "number" }, "protocolFeeUsd": { "description": "The TetraFi platform fee, in USD. `null` when the platform fee has no USD value\nrecorded (an invoiced fee before it is billed): unpriced is not the same as free.", "format": "double", "type": [ "number", "null" ] }, "solverGasUsd": { "description": "Gas the solver absorbed, in USD. `null` when no priced gas was\nrecorded for the solver.", "format": "double", "type": [ "number", "null" ] }, "totalCostUsd": { "description": "Sum of every priced row; unrecorded gas contributes nothing.", "format": "double", "type": "number" }, "userGasUsd": { "description": "Gas the taker paid, in USD. `null` when no priced gas was recorded\nfor the taker: unrecorded is not the same as free.", "format": "double", "type": [ "number", "null" ] } }, "required": [ "totalCostUsd" ], "type": "object" }, "FeesSection": { "description": "Fee breakdown for a trade: one row per transaction-level fee event (gas on each settlement transaction, protocol fee, solver fee, relayer tip), plus totals by payer (user, solver, protocol).", "properties": { "rows": { "items": { "$ref": "#/components/schemas/TradeFeeRow" }, "type": "array" }, "totals": { "$ref": "#/components/schemas/FeeTotals" } }, "required": [ "totals" ], "type": "object" }, "FiatArrivalBasis": { "description": "Where an expected arrival came from: the declared rail default or the\nprovider's own value for the transfer.\n\nNew values may be added; treat unknown values as other.", "enum": [ "default", "provider" ], "type": "string", "x-extensible-enum": true }, "FiatDirection": { "description": "Which way bank money moves at a venue.\n\nNew values may be added; treat unknown values as other.", "enum": [ "pay_in", "payout" ], "type": "string", "x-extensible-enum": true }, "FiatFeeCharging": { "description": "How a scheduled bank fee is charged. unverified remains conservative until a real movement measures it; the recipient can only receive more than the quoted minimum.\n\nNew values may be added; treat unknown values as other.", "enum": [ "deducted", "on_top", "unverified" ], "type": "string", "x-extensible-enum": true }, "FiatRail": { "type": "string" }, "FiatRailOptionKind": { "description": "A way of using a rail. Every rail has a `standard` option; VALR's fast\npayout (Blitz over RTC) is the EFT rail's `fast` option.\n\nNew values may be added; treat unknown values as other.", "enum": [ "standard", "fast" ], "type": "string", "x-extensible-enum": true }, "FillSource": { "description": "New values may be added; treat unknown values as other.", "enum": [ "protocol", "venue_account" ], "type": "string", "x-extensible-enum": true }, "FirmAsk": { "description": "When a venue gives its binding price (`PairQuote.firmAsk`), as its venue spec declares.\n\nNew values may be added; treat unknown values as other.", "enum": [ "onRequest", "atExecution" ], "type": "string", "x-extensible-enum": true }, "FirmQuoteDailyWarning": { "description": "Read-only workspace/day warning. It never admits or spends a firm ask.", "properties": { "code": { "description": "VENUE_FIRM_QUOTE_DAILY_NEAR_CAP from 80%; VENUE_FIRM_QUOTE_DAILY_CAP_REACHED at or above the UTC-day cap.", "example": "VENUE_FIRM_QUOTE_DAILY_NEAR_CAP", "type": "string" }, "limit": { "format": "int32", "minimum": 0, "type": "integer" }, "resetsAt": { "format": "date-time", "type": "string" }, "used": { "format": "int32", "minimum": 0, "type": "integer" } }, "required": [ "code", "used", "limit", "resetsAt" ], "type": "object" }, "FirstLeg": { "description": "New values may be added; treat unknown values as other.", "enum": [ "taker", "maker" ], "type": "string", "x-extensible-enum": true }, "FixedAmount": { "description": "Which request amount a quote fixes: `sellAmount` or `buyAmount`.\n\nNew values may be added; treat unknown values as other.", "enum": [ "sellAmount", "buyAmount" ], "type": "string", "x-extensible-enum": true }, "FundInstructions": { "description": "What to fund and how. Bank funding carries only a privacy-safe summary and a\nnon-bearer reference to the separately authorized reveal read.\n\nNew values may be added; treat unknown values as other.", "discriminator": { "propertyName": "kind" }, "oneOf": [ { "properties": { "address": { "type": "string" }, "asset": { "type": "string" }, "chainRef": { "type": "string" }, "expiresAt": { "format": "date-time", "type": "string" }, "kind": { "description": "New values may be added; treat unknown values as other.", "enum": [ "venueDeposit" ], "type": "string", "x-extensible-enum": true }, "memo": { "type": [ "string", "null" ] }, "networkCode": { "type": "string" }, "networkConfirmed": { "description": "False when the venue reports no network for this address: `networkCode`\nis empty and `chainRef` is the caller's selection, which the customer\nmust confirm with the venue before sending.", "type": "boolean" }, "observedAt": { "format": "date-time", "type": "string" }, "tokenContract": { "type": "string" } }, "required": [ "asset", "chainRef", "networkCode", "networkConfirmed", "address", "tokenContract", "observedAt", "expiresAt", "kind" ], "type": "object" }, { "description": "The only bank-deposit payload allowed in an asset-pair quote, request readback or\ncopied durable/evidence body. It carries no receiving coordinates or payment memo.\nFund, then explicitly requote; this summary never authorizes a transfer or order.", "properties": { "accountLast4": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/BankAccountSuffix", "description": "An already-qualified masked suffix, not external account ownership proof." } ] }, "amount": { "$ref": "#/components/schemas/DecimalAmount" }, "bankDisplayName": { "type": [ "string", "null" ] }, "expiresAt": { "description": "UTC ISO instant, or null when expiry is UNKNOWN. Null never means no expiry.", "format": "date-time", "type": [ "string", "null" ] }, "kind": { "description": "New values may be added; treat unknown values as other.", "enum": [ "bankDeposit" ], "type": "string", "x-extensible-enum": true }, "revealRef": { "$ref": "#/components/schemas/BankFundingRevealRef" } }, "required": [ "accountLast4", "amount", "bankDisplayName", "expiresAt", "kind", "revealRef" ], "type": "object" }, { "description": "The quote's own bound pay wallet (an organisation wallet on a Basic on-chain\nvenue account) holds less than the trade debits: send `amount` of `asset` to\n`address` on `chain`, then get a new price. `walletId` is the binding target the\nsource's `topUp` fix names; `tokenContract` is the registry's deployment address\nof `asset` on `chain` (the zero address for the chain's native coin).", "properties": { "address": { "type": "string" }, "amount": { "$ref": "#/components/schemas/DecimalAmount" }, "asset": { "$ref": "#/components/schemas/AssetId" }, "chain": { "$ref": "#/components/schemas/Caip2Chain" }, "kind": { "description": "New values may be added; treat unknown values as other.", "enum": [ "walletTopUp" ], "type": "string", "x-extensible-enum": true }, "tokenContract": { "type": "string" }, "walletId": { "type": "string" } }, "required": [ "walletId", "address", "chain", "asset", "tokenContract", "amount", "kind" ], "type": "object" }, { "description": "Native gas for a transaction the Taker sends itself.", "properties": { "amount": { "$ref": "#/components/schemas/DecimalAmount" }, "asset": { "$ref": "#/components/schemas/AssetId" }, "chain": { "$ref": "#/components/schemas/Caip2Chain" }, "kind": { "description": "New values may be added; treat unknown values as other.", "enum": [ "nativeGas" ], "type": "string", "x-extensible-enum": true } }, "required": [ "chain", "amount", "asset", "kind" ], "type": "object" }, { "description": "A bank-funded venue account is short and deposit first isn't offered on it:\nits bank side declares no deposit instructions, or nothing that\ncredits a declared deposit. The account is funded from its own funding details,\nthen the quote is asked again. `amount` is the shortfall in `currency`;\n`connectionId` is the venue account to fund; `reason` is the venue's declared\nsentence for why (\"Keyrock gives no deposit reference for bank transfers, so\nTetraFi can't tell your deposit apart\"), product copy without a final period.", "properties": { "amount": { "$ref": "#/components/schemas/DecimalAmount" }, "connectionId": { "type": "string" }, "currency": { "type": "string" }, "kind": { "description": "New values may be added; treat unknown values as other.", "enum": [ "depositFirstNotOffered" ], "type": "string", "x-extensible-enum": true }, "reason": { "type": "string" } }, "required": [ "connectionId", "amount", "currency", "reason", "kind" ], "type": "object" } ], "x-extensible-enum": true }, "FundingAccount": { "description": "What backs execution. A link id appears only when money moves through that link.", "properties": { "financialAccountId": { "type": "string" }, "kind": { "$ref": "#/components/schemas/FundingAccountKind" }, "linkId": { "format": "uuid", "type": [ "string", "null" ] } }, "required": [ "financialAccountId", "kind" ], "type": "object" }, "FundingAccountKind": { "description": "New values may be added; treat unknown values as other.", "enum": [ "venueAccount", "wallet", "bankAccount" ], "type": "string", "x-extensible-enum": true }, "FundingClock": { "description": "What a pay-by deadline measures. Explicit tokens retain persisted terms.\n\nNew values may be added; treat unknown values as other.", "enum": [ "payment_started", "funds_arrived" ], "type": "string", "x-extensible-enum": true }, "FundingLinkCandidate": { "description": "One cached funding link scoped to the connection's trading venue account.", "properties": { "displayName": { "type": "string" }, "financialAccountId": { "type": "string" }, "isDefault": { "type": "boolean" }, "kind": { "$ref": "#/components/schemas/FundingAccountKind" }, "linkId": { "format": "uuid", "type": "string" }, "networkOrRail": { "type": "string" } }, "required": [ "displayName", "linkId", "financialAccountId", "kind", "networkOrRail", "isDefault" ], "type": "object" }, "FundingMethod": { "description": "How a measured pay-asset shortfall is covered.\n\nNew values may be added; treat unknown values as other.", "enum": [ "venueDeposit", "bankDeposit", "walletTopUp" ], "type": "string", "x-extensible-enum": true }, "FundingModel": { "description": "What backs execution. A venue declares `prefunded` or `payIn`; `credit` is derived per\ntrade (never declared or chosen): the trade creates or increases a negative position on the\nvenue account, and `creditPortion` names how much.\n\nNew values may be added; treat unknown values as other.", "enum": [ "prefunded", "payIn", "credit" ], "type": "string", "x-extensible-enum": true }, "FundsLocation": { "description": "Where a leg's funds are when the leg does not run.\n\nTagged on `holder` so later holders (a venue-held balance, for example) are additive\nvariants rather than a new vocabulary.\n\nNew values may be added; treat unknown values as other.", "oneOf": [ { "description": "In the taker's own wallet, where they can sign with the funds again.", "properties": { "address": { "description": "The wallet, when the order records it.", "type": [ "string", "null" ] }, "funds": { "$ref": "#/components/schemas/AssetAmountDisplay" }, "holder": { "description": "New values may be added; treat unknown values as other.", "enum": [ "yourWallet" ], "type": "string", "x-extensible-enum": true } }, "required": [ "funds", "holder" ], "type": "object" }, { "description": "In another wallet the route recorded as its recipient, such as the end user of a\nbroker's order. The taker cannot re-sign with these funds.", "properties": { "address": { "type": "string" }, "funds": { "$ref": "#/components/schemas/AssetAmountDisplay" }, "holder": { "description": "New values may be added; treat unknown values as other.", "enum": [ "recipientWallet" ], "type": "string", "x-extensible-enum": true } }, "required": [ "funds", "address", "holder" ], "type": "object" }, { "description": "In a platform contract (a router, an arrival contract or an escrow), pending a\nrelease the platform or an operator performs.", "properties": { "contract": { "type": [ "string", "null" ] }, "funds": { "$ref": "#/components/schemas/AssetAmountDisplay" }, "holder": { "description": "New values may be added; treat unknown values as other.", "enum": [ "platform" ], "type": "string", "x-extensible-enum": true } }, "required": [ "funds", "holder" ], "type": "object" }, { "description": "In the route's own balance at a CEX venue, on the CEX ledger. Only this\nroute's trade or its pre-signed payout spends it: the taker retries the trade from\nit on the same order, or stops and the payout withdraws it.", "properties": { "funds": { "$ref": "#/components/schemas/AssetAmountDisplay", "description": "The asset and its `available` amount, read from the ledger." }, "holder": { "description": "New values may be added; treat unknown values as other.", "enum": [ "yourVenueBalance" ], "type": "string", "x-extensible-enum": true }, "routeId": { "description": "The ledger route the balance is scoped to, `bytes32` hex.", "type": "string" }, "venueId": { "description": "The venue's registry id.", "type": "string" } }, "required": [ "venueId", "routeId", "funds", "holder" ], "type": "object" }, { "description": "The native owner accepted the move, but no holder has issued a qualified receipt.\nReported transit is never a destination balance; references stay in Money's envelope.", "properties": { "funds": { "$ref": "#/components/schemas/AssetAmountDisplay", "description": "The asset and amount reported in transit, without a destination or native reference." }, "holder": { "description": "New values may be added; treat unknown values as other.", "enum": [ "inTransit" ], "type": "string", "x-extensible-enum": true } }, "required": [ "funds", "holder" ], "type": "object" }, { "description": "Fiat debited by the venue onto a bank rail, not yet confirmed received, including\noverdue or manual-review payouts. References stay in Money's evidence envelope.", "properties": { "funds": { "$ref": "#/components/schemas/AssetAmountDisplay", "description": "The asset and amount on the bank rail, without a destination or native reference." }, "holder": { "description": "New values may be added; treat unknown values as other.", "enum": [ "bankRail" ], "type": "string", "x-extensible-enum": true } }, "required": [ "funds", "holder" ], "type": "object" }, { "description": "In a treasury account the workspace controls that is not route-scoped: a custodian\naccount or wallet, an organisation wallet, or an ordinary LP/venue account. The order's\nown signing wallet stays `yourWallet`; producers choose from the order record.", "properties": { "accountId": { "$ref": "#/components/schemas/InventoryAccountId", "description": "The opaque inventory id, never a native vault, connection or venue-account id." }, "funds": { "$ref": "#/components/schemas/AssetAmountDisplay" }, "holder": { "description": "New values may be added; treat unknown values as other.", "enum": [ "account" ], "type": "string", "x-extensible-enum": true } }, "required": [ "accountId", "funds", "holder" ], "type": "object" } ], "x-extensible-enum": true }, "GeoSourceKind": { "description": "Where the request-geo fact comes from. `none` means no trusted source is\nconfigured in this zone, so no geo restriction is enforced (and nothing\nmay claim it is).\n\nNew values may be added; treat unknown values as other.", "enum": [ "edge_header", "none" ], "type": "string", "x-extensible-enum": true }, "IntegrationMode": { "description": "How a venue is integrated: `basic` or `advanced`.\n\nNew values may be added; treat unknown values as other.", "enum": [ "basic", "advanced" ], "type": "string", "x-extensible-enum": true }, "IntrospectionResponse": { "description": "New values may be added; treat unknown values as other.", "oneOf": [ { "properties": { "auth": { "$ref": "#/components/schemas/CredentialAuth", "description": "How this request authenticated: the key itself, or a bearer token exchanged from\nit (`POST /api/v1/oauth/token`), which carries only the scopes it was issued." }, "authKind": { "description": "New values may be added; treat unknown values as other.", "enum": [ "apiKey" ], "type": "string", "x-extensible-enum": true }, "dataScope": { "type": "string" }, "expiresAt": { "type": [ "string", "null" ] }, "keyId": { "type": "string" }, "name": { "type": "string" }, "organisationWallets": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/KeyOrganisationWalletsView", "description": "This key's own organisation-wallet venue trading. Absent for a key bound\nto no workspace." } ] }, "origin": { "type": "string" }, "permissions": { "items": { "type": "string" }, "type": "array" }, "rateLimits": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/RateLimitsView" } ] }, "scopes": { "items": { "type": "string" }, "type": "array" }, "workspaceId": { "type": [ "string", "null" ] } }, "required": [ "keyId", "name", "origin", "auth", "scopes", "permissions", "dataScope", "authKind" ], "type": "object" }, { "properties": { "authKind": { "description": "New values may be added; treat unknown values as other.", "enum": [ "jwt" ], "type": "string", "x-extensible-enum": true }, "permissions": { "description": "With `include=permissions`: the session's permissions, sorted.", "items": { "type": "string" }, "type": [ "array", "null" ] }, "profile": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/MeResponse", "description": "With `include=profile`: the signed-in user's profile." } ] }, "userId": { "type": "string" }, "verification": { "$ref": "#/components/schemas/MeVerification" }, "workspaceIds": { "items": { "type": "string" }, "type": "array" } }, "required": [ "userId", "workspaceIds", "authKind" ], "type": "object" } ], "x-extensible-enum": true }, "InventoryAccountId": { "description": "Opaque inventory account id. Never a native vault, connection or venue-account id.", "examples": [ "acct_0123456789abcdef0123456789abcdef" ], "pattern": "^acct_[0-9a-f]{32}$", "type": "string" }, "InventoryAsset": { "description": "The canonical asset a Position holds. A fiat currency carries no network;\nits marker comes from the producer (fiat), never from a symbol.\n\nNew values may be added; treat unknown values as other.", "oneOf": [ { "properties": { "assetClass": { "description": "New values may be added; treat unknown values as other.", "enum": [ "crypto" ], "type": "string", "x-extensible-enum": true }, "nativeAssetId": { "description": "The provider's own identifier: custodian asset id or venue code.", "type": "string" }, "network": { "description": "Registry chain reference (`eip155:8453`). `null` when the source does\nnot resolve exactly one network; the Position is then\n`reported/partial`, never given a guessed network.", "type": [ "string", "null" ] }, "symbol": { "description": "Canonical symbol, upper case.", "type": "string" } }, "required": [ "symbol", "nativeAssetId", "assetClass" ], "type": "object" }, { "properties": { "assetClass": { "description": "New values may be added; treat unknown values as other.", "enum": [ "fiat" ], "type": "string", "x-extensible-enum": true }, "currency": { "description": "ISO 4217 code.", "type": "string" }, "decimals": { "description": "The producer's canonical currency scale, part of asset identity.", "format": "int32", "minimum": 0, "type": "integer" } }, "required": [ "currency", "decimals", "assetClass" ], "type": "object" } ], "x-extensible-enum": true }, "IsoDuration": { "description": "An ISO 8601 duration, e.g. PT3S or PT2M.", "examples": [ "PT120S" ], "format": "duration", "pattern": "^PT(?:[0-9]+H(?:[0-9]+M)?(?:[0-9]+(?:\\.[0-9]{1,3})?S)?|[0-9]+M(?:[0-9]+(?:\\.[0-9]{1,3})?S)?|[0-9]+(?:\\.[0-9]{1,3})?S)$", "type": "string" }, "KeyOrganisationWalletGrantView": { "description": "One open grant.", "properties": { "financialAccountId": { "description": "The wallet's stored financial account (`acct_…`): the id `POST /quotes`\n`source.tradingWallets` names for this wallet.", "type": "string" }, "grantedAt": { "format": "date-time", "type": "string" }, "grantedBy": { "description": "The user who issued the grant.", "type": "string" }, "organisationWalletId": { "type": "string" } }, "required": [ "organisationWalletId", "financialAccountId", "grantedBy", "grantedAt" ], "type": "object" }, "KeyOrganisationWalletsView": { "description": "What the presented key may trade through organisation wallets now: the same\nfacts and refusal order an organisation-wallet order is checked against.", "properties": { "blockedBy": { "description": "The refusal code an organisation-wallet order would answer now, whichever\nwallet it named (for example `API_KEY_ORGANISATION_WALLET_SCOPE_REQUIRED`\nwhile no wallet is granted). Absent when the order may name one of `grants`.", "type": [ "string", "null" ] }, "grants": { "description": "The organisation wallets granted to this key; `financialAccountId` is the\nid `POST /quotes` `source.tradingWallets` names.", "items": { "$ref": "#/components/schemas/KeyOrganisationWalletGrantView" }, "type": "array" }, "requestSigningRequired": { "description": "Every request with this key must carry an HMAC signature.", "type": "boolean" }, "venueTradeEnabled": { "description": "The key's venue-trading switch is on.", "type": "boolean" }, "venueTradeScope": { "description": "The key holds `workspace_venue_trade`.", "type": "boolean" } }, "required": [ "venueTradeScope", "venueTradeEnabled", "requestSigningRequired", "grants" ], "type": "object" }, "KybRecordFacts": { "description": "Recorded KYB approval dates and the independently observed active review.", "properties": { "expiresAt": { "format": "date-time", "type": [ "string", "null" ] }, "review": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/KybReviewObservation", "description": "The workspace's active KYB review, when there is one." } ] }, "verifiedAt": { "format": "date-time", "type": [ "string", "null" ] } }, "type": "object" }, "KybRecordObservation": { "description": "Permission-filtered observation of the workspace's KYB record.\n\nNew values may be added; treat unknown values as other.", "oneOf": [ { "description": "This workspace type carries no KYB record, such as a direct user.", "properties": { "state": { "description": "New values may be added; treat unknown values as other.", "enum": [ "not_applicable" ], "type": "string", "x-extensible-enum": true } }, "required": [ "state" ], "type": "object" }, { "description": "Withheld from this reader. KYB dates and review facts are released only to a signed-in member with compliance view permission; an API key always reads withheld. workspace.kybStatus still carries the KYB state.", "properties": { "state": { "description": "New values may be added; treat unknown values as other.", "enum": [ "withheld" ], "type": "string", "x-extensible-enum": true } }, "required": [ "state" ], "type": "object" }, { "description": "A KYB-bearing workspace has no business profile; KYB has not started.", "properties": { "state": { "description": "New values may be added; treat unknown values as other.", "enum": [ "absent" ], "type": "string", "x-extensible-enum": true } }, "required": [ "state" ], "type": "object" }, { "description": "The workspace's business profile could not be read, so its KYB facts are unknown; never read as absent. Retry shortly.", "properties": { "state": { "description": "New values may be added; treat unknown values as other.", "enum": [ "unavailable" ], "type": "string", "x-extensible-enum": true } }, "required": [ "state" ], "type": "object" }, { "allOf": [ { "$ref": "#/components/schemas/KybRecordFacts", "description": "The business profile's recorded KYB facts." }, { "properties": { "state": { "description": "New values may be added; treat unknown values as other.", "enum": [ "recorded" ], "type": "string", "x-extensible-enum": true } }, "required": [ "state" ], "type": "object" } ], "description": "The business profile's recorded KYB facts." } ], "x-extensible-enum": true }, "KybReviewFacts": { "description": "An active KYB review's queue facts. Reviewer notes, reviewer identity and provider references are never included.", "properties": { "decidedAt": { "format": "date-time", "type": [ "string", "null" ] }, "queueId": { "format": "uuid", "type": "string" }, "reason": { "$ref": "#/components/schemas/RenewalReason" }, "status": { "$ref": "#/components/schemas/ApprovalStatus" }, "submittedAt": { "format": "date-time", "type": "string" } }, "required": [ "queueId", "status", "reason", "submittedAt" ], "type": "object" }, "KybReviewObservation": { "description": "Whether the active KYB review read found a record or was unavailable.\n\nNew values may be added; treat unknown values as other.", "oneOf": [ { "description": "The read succeeded with no review in flight or on record as active.", "properties": { "state": { "description": "New values may be added; treat unknown values as other.", "enum": [ "none" ], "type": "string", "x-extensible-enum": true } }, "required": [ "state" ], "type": "object" }, { "allOf": [ { "$ref": "#/components/schemas/KybReviewFacts", "description": "The active review's recorded queue facts." }, { "properties": { "state": { "description": "New values may be added; treat unknown values as other.", "enum": [ "recorded" ], "type": "string", "x-extensible-enum": true } }, "required": [ "state" ], "type": "object" } ], "description": "The active review's recorded queue facts." }, { "description": "The read failed; never interpreted as no review.", "properties": { "state": { "description": "New values may be added; treat unknown values as other.", "enum": [ "unavailable" ], "type": "string", "x-extensible-enum": true } }, "required": [ "state" ], "type": "object" } ], "x-extensible-enum": true }, "KycRenewalStatusResponse": { "description": "Lightweight account-scoped renewal status snapshot.", "properties": { "kycExpiryDate": { "description": "Current renewal / attestation expiry anchor when known.", "format": "date-time", "type": [ "string", "null" ] }, "kycStatus": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/CounterpartyKycStatus", "description": "Current KYC lifecycle state from the compliance record." } ] } }, "type": "object" }, "LadderSemantics": { "description": "New values may be added; treat unknown values as other.", "enum": [ "incremental" ], "type": "string", "x-extensible-enum": true }, "LateFunds": { "description": "New values may be added; treat unknown values as other.", "oneOf": [ { "properties": { "action": { "description": "New values may be added; treat unknown values as other.", "enum": [ "returned" ], "type": "string", "x-extensible-enum": true } }, "required": [ "action" ], "type": "object" }, { "properties": { "action": { "description": "New values may be added; treat unknown values as other.", "enum": [ "re_priced" ], "type": "string", "x-extensible-enum": true }, "untilSeconds": { "format": "int32", "minimum": 0, "type": "integer" } }, "required": [ "untilSeconds", "action" ], "type": "object" }, { "properties": { "action": { "description": "New values may be added; treat unknown values as other.", "enum": [ "held" ], "type": "string", "x-extensible-enum": true } }, "required": [ "action" ], "type": "object" }, { "properties": { "action": { "description": "New values may be added; treat unknown values as other.", "enum": [ "handled_by_support" ], "type": "string", "x-extensible-enum": true } }, "required": [ "action" ], "type": "object" } ], "x-extensible-enum": true }, "LedgerLagRef": { "description": "How far the platform's ACE event listener for one chain trails that\nchain's head, the same position `/health.compliance.aceEventListeners`\nreports.\n\n`listenerPresent: false` means this chain has no listener at all, which\nis distinct from a present but lagging listener and is never reported as\n`lagBlocks: 0`.", "properties": { "chainId": { "format": "int64", "minimum": 0, "type": "integer" }, "cursorBlock": { "format": "int64", "minimum": 0, "type": [ "integer", "null" ] }, "engineAddress": { "type": [ "string", "null" ] }, "headBlock": { "format": "int64", "minimum": 0, "type": [ "integer", "null" ] }, "lagBlocks": { "format": "int64", "minimum": 0, "type": [ "integer", "null" ] }, "listenerPresent": { "type": "boolean" }, "stale": { "type": "boolean" } }, "required": [ "chainId", "listenerPresent", "stale" ], "type": "object" }, "LegAttempt": { "description": "One ended attempt at a leg.\n\nThe attempt in progress is implicit: it is the number of ended attempts plus one.", "properties": { "acceptedReference": { "description": "A re-price the taker accepted during this attempt, in base units.", "type": [ "string", "null" ] }, "attempt": { "format": "int32", "minimum": 0, "type": "integer" }, "chainId": { "description": "The chain `txHash` lives on.", "format": "int64", "minimum": 0, "type": [ "integer", "null" ] }, "endedAt": { "format": "int64", "type": "integer" }, "fundsAt": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/FundsLocation", "description": "Where the funds were when this attempt ended." } ] }, "linkedOrderId": { "description": "A separate order that finished this trade from where this attempt left it.", "type": [ "string", "null" ] }, "outcome": { "$ref": "#/components/schemas/LegAttemptOutcome" }, "reason": { "description": "Stable machine code, e.g. `priceMovedBeyondBand`, `venueRefused`,\n`waitLimitReached`. Never prose.", "type": [ "string", "null" ] }, "txHash": { "type": [ "string", "null" ] } }, "required": [ "attempt", "endedAt", "outcome" ], "type": "object" }, "LegAttemptOutcome": { "description": "How one attempt at a leg ended.\n\nNew values may be added; treat unknown values as other.", "enum": [ "returnedToYou", "recovered", "stopped", "settled", "linkedOrder" ], "type": "string", "x-extensible-enum": true }, "LegCounterparty": { "description": "A route leg's counterparty compliance posture (admin trade-detail only).", "properties": { "counterpartyType": { "description": "`vasp` | `bilateral` | `protocol` | `solver` — the nature of this leg's filler.", "type": "string" }, "jurisdiction": { "description": "ISO-3166 alpha-2 home jurisdiction of the LP entity (KYB'd solver legs only).", "type": [ "string", "null" ] }, "kybStatus": { "description": "KYB status of the LP workspace behind this leg (`approved` / … ).", "type": [ "string", "null" ] }, "licences": { "description": "Regulatory licences the leg's LP holds.", "items": { "$ref": "#/components/schemas/LegLicence" }, "type": "array" }, "provenance": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/LpDataProvenance", "description": "Who supplied the LP entity's facts, when an entity profile backs this leg.\nA `platformCurated` venue (e.g. Circle) carries a raw `not_started` KYB row\nby design; this field is what distinguishes it from an unverified LP." } ] } }, "required": [ "counterpartyType" ], "type": "object" }, "LegLicence": { "description": "A single regulatory licence held by a route leg's LP.", "properties": { "expiresAt": { "format": "date-time", "type": [ "string", "null" ] }, "jurisdiction": { "type": "string" }, "licenceType": { "type": "string" }, "status": { "type": "string" } }, "required": [ "licenceType", "jurisdiction", "status" ], "type": "object" }, "LegLocation": { "description": "Where a leg executes and first settles. Each kind carries only its own\nfields; any other combination fails to parse.\n\nNew values may be added; treat unknown values as other.", "discriminator": { "propertyName": "kind" }, "oneOf": [ { "properties": { "chain": { "$ref": "#/components/schemas/Caip2Chain" }, "kind": { "description": "New values may be added; treat unknown values as other.", "enum": [ "singleChain" ], "type": "string", "x-extensible-enum": true } }, "required": [ "chain", "kind" ], "type": "object" }, { "properties": { "from": { "$ref": "#/components/schemas/Caip2Chain" }, "kind": { "description": "New values may be added; treat unknown values as other.", "enum": [ "crossChain" ], "type": "string", "x-extensible-enum": true }, "to": { "$ref": "#/components/schemas/Caip2Chain" } }, "required": [ "from", "to", "kind" ], "type": "object" }, { "properties": { "kind": { "description": "New values may be added; treat unknown values as other.", "enum": [ "offChain" ], "type": "string", "x-extensible-enum": true }, "tradingSource": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/TradingSource", "description": "Absent only on a priced card whose named sourceRefusal disables ordering." } ] } }, "required": [ "kind" ], "type": "object" } ], "x-extensible-enum": true }, "LegMode": { "description": "How a leg after the first runs.\n\nNew values may be added; treat unknown values as other.", "enum": [ "atomic", "automatic", "needsSignature" ], "type": "string", "x-extensible-enum": true }, "LocationKind": { "description": "Where a leg executes and first settles.\n\nNew values may be added; treat unknown values as other.", "enum": [ "singleChain", "crossChain", "offChain" ], "type": "string", "x-extensible-enum": true }, "LpDataProvenance": { "description": "Trust label for the entity facts on a row: who supplied them.\n\nComputed at read time: a KYB-approved entity is always `KybVerified`;\notherwise the stored `entity_profiles.data_source` value wins\n(`platform_curated` for registry/ops-seeded facts, `self_declared` for\nLP-supplied profile edits).\n\nNew values may be added; treat unknown values as other.", "enum": [ "kybVerified", "platformCurated", "selfDeclared" ], "type": "string", "x-extensible-enum": true }, "LpInfoSection": { "description": "Section D: LP / counterparty information, including its compliance posture.\n\nFor a KYB'd liquidity provider the compliance fields carry the LP's\njurisdiction, KYB status, and regulatory licences — the \"who is the other\nside and are they authorised\" a compliance officer needs. Router/bridge\nroutes settle through a protocol (CCTP, Relay, …), not a VASP counterparty:\nthose report `counterparty_type = \"protocol\"` with no jurisdiction/licences,\nwhich is itself the compliance-relevant fact (no VASP-to-VASP Travel Rule\nmessage is owed).", "properties": { "bilateralStatus": { "type": [ "string", "null" ] }, "lpName": { "type": "string" }, "lpSource": { "type": "string" }, "routingPathLabel": { "type": "string" }, "settlementSlaStatus": { "type": [ "string", "null" ] }, "settlementSpeedMs": { "format": "int64", "minimum": 0, "type": [ "integer", "null" ] }, "solverId": { "type": "string" } }, "required": [ "solverId", "lpName", "lpSource", "routingPathLabel" ], "type": "object" }, "LpInformationNeeded": { "description": "One LP whose enforced serving requirement finds a fact the workspace has\nnot recorded, and the onboarding catalogue items that supply it. Advisory:\nit blocks nothing by itself; the trading path refuses with\n`LP_REQUIREMENT_INFORMATION_NEEDED` and the same items.", "properties": { "items": { "description": "Catalogue item ids (`std.*`), in catalogue-map order, without repeats.", "items": { "type": "string" }, "type": "array" }, "lpEntityId": { "type": "string" } }, "required": [ "lpEntityId", "items" ], "type": "object" }, "MakerFillsContext": { "description": "The fills list's context, field for field as the fills read returns it.", "properties": { "accountSummary": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/VenueFillSummary", "description": "Venue-account totals, when the read asked for them (flow=venue_account&includeAccountSummary=true)." } ] }, "ownedSolvers": { "description": "The solvers this LP workspace owns.", "items": { "$ref": "#/components/schemas/OwnedSolverIdentity" }, "type": "array" }, "selectedAccountFilter": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/VenueFillFilter", "description": "The venue-account filter the read applied, when one was requested." } ] }, "selectedBrokerId": { "description": "The broker filter the read applied.", "type": [ "string", "null" ] }, "selectedCohort": { "description": "The cohort filter the read applied.", "type": [ "string", "null" ] }, "selectedRiskScope": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/RecordedRiskTradeScope", "description": "The recorded risk scope the read applied, when one was requested." } ] }, "selectedSolverId": { "description": "The solver the fills were read for.", "type": [ "string", "null" ] } }, "required": [ "ownedSolvers", "selectedSolverId", "selectedBrokerId", "selectedCohort" ], "type": "object" }, "MakerListContext": { "description": "The maker read's own page context: the fills list's (perspective=maker) or the\nsettlement queue's (perspective=maker with settlementStage or minAgeSeconds).", "oneOf": [ { "$ref": "#/components/schemas/MakerFillsContext" }, { "$ref": "#/components/schemas/MakerSettlementContext" } ] }, "MakerSettlementContext": { "description": "The settlement queue's context, field for field as the queue read returns it.", "properties": { "asOf": { "description": "When the queue snapshot was read.", "format": "date-time", "type": "string" }, "maxOffset": { "description": "Beyond this bound the operator must narrow stage, corridor or connection.", "format": "int32", "minimum": 0, "type": "integer" }, "offset": { "description": "The page's offset.", "format": "int32", "minimum": 0, "type": "integer" } }, "required": [ "asOf", "offset", "maxOffset" ], "type": "object" }, "MeResponse": { "properties": { "createdAt": { "type": "string" }, "email": { "type": [ "string", "null" ] }, "emailVerified": { "type": "boolean" }, "firstName": { "type": "string" }, "hasGoogle": { "type": "boolean" }, "lastName": { "type": "string" }, "mfaEnabled": { "type": "boolean" }, "permissions": { "items": { "type": "string" }, "type": "array" }, "platformPermissions": { "description": "Platform-level permissions, separate from workspace permissions.", "items": { "type": "string" }, "type": "array" }, "productTourCompletedAt": { "description": "When the user finished or skipped the guided product tour (RFC 3339);\nnull until then. One flag per user, across devices and workspaces.", "type": [ "string", "null" ] }, "profileComplete": { "description": "Whether the user has completed all required profile fields.", "type": "boolean" }, "protocolAdmin": { "$ref": "#/components/schemas/ProtocolAdminMeResponse" }, "userId": { "type": "string" }, "walletAddress": { "type": [ "string", "null" ] } }, "required": [ "userId", "firstName", "lastName", "hasGoogle", "mfaEnabled", "emailVerified", "profileComplete", "permissions", "platformPermissions", "protocolAdmin", "createdAt" ], "type": "object" }, "MeVerification": { "description": "The signed-in account's verification: its KYC status with linked-wallet attestations, and\nwhere its renewal stands.", "properties": { "renewal": { "$ref": "#/components/schemas/KycRenewalStatusResponse" }, "status": { "$ref": "#/components/schemas/AccountKycStatusResponse" } }, "required": [ "status", "renewal" ], "type": "object" }, "NetReceived": { "description": "The comparison value: known, or unavailable with its reason, never 0.\n\nNew values may be added; treat unknown values as other.", "discriminator": { "propertyName": "kind" }, "oneOf": [ { "properties": { "amount": { "$ref": "#/components/schemas/DecimalAmount" }, "kind": { "description": "New values may be added; treat unknown values as other.", "enum": [ "known" ], "type": "string", "x-extensible-enum": true } }, "required": [ "amount", "kind" ], "type": "object" }, { "properties": { "kind": { "description": "New values may be added; treat unknown values as other.", "enum": [ "unavailable" ], "type": "string", "x-extensible-enum": true }, "reason": { "description": "Known source reason tokens (not all apply to every status): `adapterPayloadSerializationFailed`, `basicVenueAccountsUnavailable`, `billingPaymentOverdue`, `walletNotOnChain`, `ccxtVenueRequiresCexLane`, `executionStageDisabled`, `jurisdictionUnproven`, `onboardedVenuesUnavailable`, `onchainAccountDefaultWalletRequired`, `onchainAccountDefaultWalletUnavailable`, `onchainAccountWalletRequired`, `onchainAssetDecimalsMismatch`, `onchainAssetIdentityMismatch`, `onchainAssetUnmapped`, `onchainAssetVariantFiltered`, `onchainWalletUnavailable`, `onchainCatalogueUnavailable`, `onchainDeliverToNotReceivingWallet`, `onchainDeliverToUnverified`, `onchainMarketsUnavailable`, `onchainMarketCatalogUnreadable`, `onchainMarketChainRequired`, `onchainMarketVariantRequired`, `onchainMarketTokenRequired`, `onchainSiteChainUnreadable`, `onchainWalletChainUnreadable`, `onchainWalletInactive`, `onchainWalletNotLinked`, `onchainWalletNotUsable`, `onchainWalletPickAmbiguous`, `onchainWalletWrongNetwork`, `signerLacksRight`, `signerUnavailable`, `signingGrantAmbiguous`, `signingGrantExpired`, `signingGrantRequired`, `signingGrantTokenNotKept`, `signingGrantTokenNotPayable`, `solverChainUnready`, `walletChainMismatch`, `walletNotUsableByYou`, `walletNotVerifiedForAce`, `walletNotWhitelisted`, `withdrawalChainUnsupported`, `accountFeeUnavailable`, `comparisonCostsUnavailable`, `connectionListingUnavailable`, `feeUnverified`, `noPool`, `noPrice`, `noSize`, `notFilled`, `notYetPublished`, `priceArithmetic`, `priceSourceNone`, `referenceMidUnavailable`, `settlementPrecisionUnavailable`, `accountSetupIncomplete`, `admissionUnavailable`, `advancedAccountEligibilityUnavailable`, `advancedAccountStateInconsistent`, `advancedConnectionDisabled`, `advancedConnectionNotConfigured`, `advancedConnectionPaused`, `advancedSettlementNeedsVerification`, `advancedModeDisabled`, `advancedNotAvailableForAccount`, `advancedNotEnabledForAccount`, `allowanceUnavailable`, `acrossCapacityExceeded`, `relayCapacityExceeded`, `acrossChainNotCarried`, `cctpChainNotCarried`, `relayChainNotCarried`, `apiKeyAdvancedWalletUnsupported`, `apiKeyOrganisationWalletScopeRequired`, `grantCapExceeded`, `amountAboveMaximum`, `amountBelowMinimum`, `amountUnreadable`, `amountsUnreadable`, `askFirst`, `authorityUnavailable`, `automationNeverAsks`, `availabilityUnreadable`, `backgroundNeverAsks`, `balanceUnreadable`, `defaultsUnavailable`, `walletHasNoAddress`, `walletUnavailable`, `bondAmountUnreadable`, `bondAssetUnreadable`, `catalogueUnavailable`, `chainFamilyUnknown`, `chainUnrecorded`, `clientSessionRequired`, `clockUnreadable`, `comingSoon`, `connectionChanged`, `connectionRevoked`, `corridorInvalid`, `credential`, `deadlineExceeded`, `defaultsLoading`, `deliverToCalldataUnsupported`, `deliverToTagUnsupported`, `deliverToNotPermitted`, `deliverToUnreadable`, `tradingPermissionRequired`, `directPatienceHarvest`, `economicallyInferior`, `exactAmountConflictsWithCard`, `exactAmountConflictsWithQuote`, `exactOutputDeliveryUnsupported`, `exactOutputEstimateUnavailable`, `exactRouteHypothesisUnavailable`, `expiredOnArrival`, `expiryUnknown`, `feeUnreadable`, `filteredOut`, `firmAskRefused`, `freshnessUnknown`, `fundingWindow`, `insufficientLiquidity`, `venueRelationship`, `venueRelationshipUnavailable`, `lpUnknown`, `mfaEnrolmentRequired`, `mfaRequired`, `minimumUnverified`, `mixedNetworks`, `netReceivedUnavailable`, `networkUnrecorded`, `noAddress`, `noCard`, `noFetcher`, `noInventory`, `noLaneForPair`, `noLegs`, `noOnChainCorridor`, `noPlannedVenue`, `noQuote`, `noRpc`, `notConnected`, `notEligible`, `notExecutable`, `orderPayloadMissing`, `outsideTopComposites`, `pairUnmapped`, `sellChainInvalid`, `permissionsUnreadable`, `placeOrderNotPermitted`, `prefundingMarkerUnreadable`, `prefundingRequired`, `indicative`, `priceOnRequest`, `priceOutOfRange`, `priceProtectionInvalid`, `pricingBookOnly`, `productNotQuoted`, `protocolChainMissing`, `providerFeeTreatmentUnknown`, `providerSiteUnrecorded`, `quoteIdUnissuable`, `quoteNotHeld`, `buyChainInvalid`, `buyAmountUnsupported`, `exactOutputDebitUnavailable`, `pairNotServed`, `receiveWalletNotServed`, `referenceMidUnreadable`, `referencePriceUnavailable`, `registryUnavailable`, `releaseRecheckUnavailable`, `requestUnbuildable`, `routeLegChainUnknown`, `routeLegUnnamed`, `routeLegUnplanned`, `routeUnavailable`, `secondFactorUnreadable`, `shortfallUnmeasured`, `shortfallUnreadable`, `singleChainVenue`, `siteChainUnreadable`, `sizeNotEligible`, `submitOrderBlocked`, `takerOnboardingIncomplete`, `tierNotQuoted`, `tradePaused`, `unsupportedNative`, `venueConnectionStorageUnavailable`, `venueDataStale`, `venueDeclined`, `venueNotConnected`, `venueNotEnabledForWorkspace`, `venueNotListed`, `venueTradeKeyUnavailable`, `venueTradeScopeRequired`, `venueTradeUnreadable`, `venueUnavailable`, `walletRefused`, `withdrawalFeeUnread`, `acrossRoutedViaCctp`, `apiKeyOrganisationWalletNotAllowlisted`, `balanceAvailabilityUnconfirmed`, `bankDestinationUnavailable`, `bebopJamKeyNotEnabled`, `bebopJamQuoteDeclined`, `bebopTokenUnavailable`, `relayCurrencyUnsupported`, `relaySwapImpactTooHigh`, `tetrafiSolverCallbackNotAuthorized`, `tradingLinkSnapshotChanged`, `tradingLinkSnapshotUnavailable`, `uniswapChainReadUnavailable`, `uniswapInsufficientDepth`, `uniswapQuoteUnreadable`, `uniswapUnwrapAboveDailyCap`, `uniswapUnwrapAboveTradeCap`, `uniswapRouteNotGranted`, `venueNotEnabled`, `askLimitReached`, `balanceMeaningUnconfirmed`, `bebopJamWalletUnsupported`, `bebopQuorumWalletTooSlow`, `bebopWalletQuorumUnreadable`, `connectionNotConfigured`, `deliveryAccountNetworkUnavailable`, `deliveryAccountUnavailable`, `destinationCannotSendOnChain`, `dexReferencePriceUnavailable`, `firmQuoteLimited`, `fundingAccountNetworkUnavailable`, `fundingAccountUnavailable`, `insufficientDepth`, `missingPermission`, `needsNativeGas`, `needsWallet`, `notPriced`, `payInTermsUnavailable`, `pilotTradeCapExceeded`, `platformFeeRateUnavailable`, `pricingBookPairUnserved`, `settlementDeclarationUnavailable`, `settlementNotAvailable`, `timedOut`, `timedOutBeforeSend`, `tradingSourceNetworkUnavailable`, `tradingSourceNotLinked`, `venueEnablementRechecking`, `venueEnablementUnavailable`, `venueListingTimedOut`, `venuePoliciesUnavailable`.\n\nNew values may be added; treat unknown values as other.", "type": "string" } }, "required": [ "reason", "kind" ], "type": "object" } ], "x-extensible-enum": true }, "NextAction": { "description": "What the order needs from its reader next. Absent when nothing is needed.\n\nEach variant is a distinct situation with a distinct remedy; none collapses onto\nanother, and a state the backend cannot decide yields no action rather than a\n`signNextLeg` it cannot back.\n\nNew values may be added; treat unknown values as other.", "oneOf": [ { "description": "The payout remains unsent with its venue-account hold retained.", "properties": { "kind": { "description": "New values may be added; treat unknown values as other.", "enum": [ "payoutFeeRose" ], "type": "string", "x-extensible-enum": true }, "legId": { "format": "uuid", "type": "string" } }, "required": [ "legId", "kind" ], "type": "object" }, { "description": "A bound wallet destination is no longer usable. Funds remain at the LP.", "properties": { "kind": { "description": "New values may be added; treat unknown values as other.", "enum": [ "provideDestination" ], "type": "string", "x-extensible-enum": true }, "legId": { "format": "uuid", "type": "string" }, "reason": { "type": "string" } }, "required": [ "legId", "reason", "kind" ], "type": "object" }, { "description": "The taker signs the next leg. `legIndex` 0 is an FX-first order that has not\nstarted: its funds are still in the taker's wallet.", "properties": { "kind": { "description": "New values may be added; treat unknown values as other.", "enum": [ "signNextLeg" ], "type": "string", "x-extensible-enum": true }, "legIndex": { "format": "int32", "minimum": 0, "type": "integer" } }, "required": [ "legIndex", "kind" ], "type": "object" }, { "description": "The fresh price moved past the tolerance. The taker may accept it once.", "properties": { "kind": { "description": "New values may be added; treat unknown values as other.", "enum": [ "priceMoved" ], "type": "string", "x-extensible-enum": true }, "offer": { "$ref": "#/components/schemas/ContinuationRepricingOffer" } }, "required": [ "offer", "kind" ], "type": "object" }, { "description": "A leg did not run and the funds came back to the taker: sign it again, on the\nsame order.", "properties": { "attempt": { "description": "The attempt the retry starts (the ended attempts plus one).", "format": "int32", "minimum": 0, "type": "integer" }, "fundsAt": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/FundsLocation" } ] }, "kind": { "description": "New values may be added; treat unknown values as other.", "enum": [ "retryNextLeg" ], "type": "string", "x-extensible-enum": true }, "legIndex": { "format": "int32", "minimum": 0, "type": "integer" }, "reason": { "type": "string" } }, "required": [ "legIndex", "attempt", "reason", "kind" ], "type": "object" }, { "description": "The route ended with the funds in the taker's wallet part-way, and no re-quote\nowner can resume it: finish the trade from there with a new order.", "properties": { "fundsAt": { "$ref": "#/components/schemas/FundsLocation" }, "kind": { "description": "New values may be added; treat unknown values as other.", "enum": [ "finishTrade" ], "type": "string", "x-extensible-enum": true }, "reason": { "type": "string" } }, "required": [ "fundsAt", "reason", "kind" ], "type": "object" }, { "description": "The taker stopped waiting, or the wait reached its bound.", "properties": { "fundsAt": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/FundsLocation" } ] }, "kind": { "description": "New values may be added; treat unknown values as other.", "enum": [ "stopped" ], "type": "string", "x-extensible-enum": true }, "reason": { "$ref": "#/components/schemas/StopReason" } }, "required": [ "reason", "kind" ], "type": "object" }, { "description": "An operator must review the order; the taker cannot act on it.", "properties": { "kind": { "description": "New values may be added; treat unknown values as other.", "enum": [ "supportReview" ], "type": "string", "x-extensible-enum": true }, "reason": { "type": "string" } }, "required": [ "reason", "kind" ], "type": "object" } ], "x-extensible-enum": true }, "NextActor": { "description": "Who must act before the order can progress, shared by the order read and list.\n\nNew values may be added; treat unknown values as other.", "enum": [ "taker", "support", "counterparty", "none" ], "type": "string", "x-extensible-enum": true }, "OAuthErrorResponse": { "description": "An RFC 6749 error response: the token endpoint answers the standard's body, not `ApiError`.", "properties": { "error": { "description": "The RFC 6749 error code: `invalid_client` (401), `invalid_grant`, `unsupported_grant_type`\nor `unauthorized_client` (400), or `temporarily_unavailable` (503).", "type": "string" }, "error_description": { "description": "Why the client was refused, when the RFC 6749 code alone does not say.", "type": [ "string", "null" ] }, "error_uri": { "description": "The error-code reference for a TetraFi cause the RFC 6749 code does not name\n(`SIGNED_KEY_NOT_EXCHANGEABLE`).", "type": [ "string", "null" ] } }, "required": [ "error" ], "type": "object" }, "OAuthTokenRequest": { "description": "An RFC 6749 client-credentials token request, form-encoded. Its field names are the\nstandard's, so OAuth client libraries send it unchanged.", "properties": { "client_id": { "description": "The service account's id. Omit it when the credentials are sent with HTTP Basic.", "type": [ "string", "null" ] }, "client_secret": { "description": "The service account's full API key (`tfk_live_…` or `tfk_test_…`). Omit it when the\ncredentials are sent with HTTP Basic.", "type": [ "string", "null" ] }, "grant_type": { "description": "Always `client_credentials`.", "type": [ "string", "null" ] } }, "type": "object" }, "OAuthTokenResponse": { "description": "An RFC 6749 access token response.", "properties": { "access_token": { "description": "The bearer token: send it as `Authorization: Bearer `.", "type": "string" }, "expires_in": { "description": "Seconds until the token expires (at most 900). Request a new one before then.", "format": "int64", "minimum": 0, "type": "integer" }, "scope": { "description": "The token's API scopes, space-separated.", "type": "string" }, "token_type": { "description": "Always `Bearer`.", "type": "string" } }, "required": [ "access_token", "token_type", "expires_in", "scope" ], "type": "object" }, "OnChainCoverage": { "description": "On-chain (ACE policy run) coverage for one order.\n\nEvaluated in this order, so a POSITIVE observation always wins over an\nexplanation: `PolicyRun` → `ProviderLedger` → `NoTxRecorded` →\n`LedgerBehind` → `NoPolicyRun`.\n\nNew values may be added; treat unknown values as other.", "oneOf": [ { "description": "At least one recorded ACE policy run matches one of the order's\ndeclared transactions AND that run's gate is `enforced`: a policy\nactually evaluated the call.\n\n`runs` carries EVERY joined run, enforced or not, and `open_runs` /\n`unknown_runs` count the ones that are not evidence of screening.\nThose counts are redundant with `runs` on purpose: an `Open` run is a\nfail-open gate that must stay visible even when a sibling run on the\nsame transaction covered the trade, and a reader that has to fold over\n`runs` to notice it is a reader that will not.", "properties": { "openRuns": { "format": "int32", "minimum": 0, "type": "integer" }, "runs": { "items": { "$ref": "#/components/schemas/PolicyRunRef" }, "type": "array" }, "state": { "description": "New values may be added; treat unknown values as other.", "enum": [ "policyRun" ], "type": "string", "x-extensible-enum": true }, "unknownRuns": { "format": "int32", "minimum": 0, "type": "integer" } }, "required": [ "runs", "openRuns", "unknownRuns", "state" ], "type": "object" }, { "description": "Runs join the order's transactions, NONE is enforced, and at least one\npassed unchecked: the engine's policy chain for that\n`(target, selector)` was empty and the default allowed it.\n\nDeliberately NOT `policyRun`. `PolicyEngine.run` emits the\nsame event whether a policy allowed the call or no policy existed at\nall, so collapsing this onto \"a policy run exists\" reports a fail-open\ngate as screened.", "properties": { "runs": { "items": { "$ref": "#/components/schemas/PolicyRunRef" }, "type": "array" }, "state": { "description": "New values may be added; treat unknown values as other.", "enum": [ "policyRunOpen" ], "type": "string", "x-extensible-enum": true } }, "required": [ "runs", "state" ], "type": "object" }, { "description": "Runs join the order's transactions and NONE of their postures could be\nestablished. Neither evidence of screening nor of its absence.", "properties": { "runs": { "items": { "$ref": "#/components/schemas/PolicyRunRef" }, "type": "array" }, "state": { "description": "New values may be added; treat unknown values as other.", "enum": [ "policyRunUnknown" ], "type": "string", "x-extensible-enum": true } }, "required": [ "runs", "state" ], "type": "object" }, { "description": "The order's venue is DECLARED by the contract registry as a deferred\nprovider-ledger venue (the registry's own OTC path set: `venueType`\n`otc` / `cex_spot`, or a solver or venue id the registry classifies\nthere). Such a venue settles on the provider's books and TetraFi\nbroadcasts nothing on its behalf, so an absent policy run is correct\nby design rather than a gap.\n\n`declaredBy` records the declaration that decided it, so the claim\nis auditable.\n\nNOT the same thing as the catalogued scenario's `external_venue`\nsub-class, which describes a TetraFi-BROADCAST transaction landing on\nregistry-declared third-party infrastructure (Circle's\n`tokenMessengerV2`, Across's `spokePool`, Circle's `fxEscrow`). The\ntwo are disjoint by construction — this one broadcasts nothing at\nall — and they are deliberately not given one shared label.\n\nLimit: the registry declares no property that separates a venue whose\nexecution reaches a TetraFi contract (e.g. `octarine-rwa`, an `onchain`\ndirect venue that executes through a TetraFi swap contract) from one\nwhose execution does not (e.g. a `circle-cctp` taker burn straight to\nCircle's TokenMessengerV2). Those are reported as `noPolicyRun`.", "properties": { "declaredBy": { "type": "string" }, "state": { "description": "New values may be added; treat unknown values as other.", "enum": [ "providerLedger" ], "type": "string", "x-extensible-enum": true } }, "required": [ "declaredBy", "state" ], "type": "object" }, { "description": "The order declares no transaction hash in any of its own or its\nsettlement's fields, so there is nothing to match.", "properties": { "state": { "description": "New values may be added; treat unknown values as other.", "enum": [ "noTxRecorded" ], "type": "string", "x-extensible-enum": true } }, "required": [ "state" ], "type": "object" }, { "description": "The order declares transactions, no event joins them, and the ACE\nevent ledger is not current for at least one of the order's\ncandidate chains — so the absence is inconclusive.", "properties": { "chains": { "items": { "$ref": "#/components/schemas/LedgerLagRef" }, "type": "array" }, "state": { "description": "New values may be added; treat unknown values as other.", "enum": [ "ledgerBehind" ], "type": "string", "x-extensible-enum": true } }, "required": [ "chains", "state" ], "type": "object" }, { "description": "The order declares transactions, the ledger is current for every\ncandidate chain, and no policy-run event exists. Provisional: the\ncatalogued scenario's RPC probe sub-classifies each one.", "properties": { "state": { "description": "New values may be added; treat unknown values as other.", "enum": [ "noPolicyRun" ], "type": "string", "x-extensible-enum": true }, "transactions": { "items": { "$ref": "#/components/schemas/OrderTxRef" }, "type": "array" } }, "required": [ "transactions", "state" ], "type": "object" } ], "x-extensible-enum": true }, "OnChainSettlementSection": { "description": "Section B: On-chain settlement data.\n\nModels the four-step lifecycle of an intent on-chain: `submit_tx` (user\ndeposit / intent creation), `fill_tx` (solver fill on destination chain),\n`proof_tx` (cross-chain proof submission), `finalise_tx` (claim/settle on\norigin). Oracle + settlement_stage describe the proof-relay layer.", "properties": { "cexLane": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/CexLaneSettlement", "description": "Confirmed CEX ledger stages, including venue evidence and the DDR v2 forward." } ] }, "failureReason": { "description": "A human-readable failure reason when status is `failed` or `refunded`.", "type": [ "string", "null" ] }, "fillTx": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/TxReference" } ] }, "finaliseTx": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/TxReference" } ] }, "oracle": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/OracleInfo" } ] }, "proofTx": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/TxReference" } ] }, "recipientWallet": { "type": [ "string", "null" ] }, "settlementSpeedMs": { "format": "int64", "minimum": 0, "type": [ "integer", "null" ] }, "settlementStage": { "type": [ "string", "null" ] }, "status": { "type": "string" }, "submitTx": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/TxReference" } ] }, "transactions": { "description": "Generic per-stage transaction list — the full timeline for ANY order kind\n(escrow quartet, bridge/relay/FX legs, composite hops), each row enriched with\na `label`, an `explorerUrl`, and a `legIndex`. The escrow-shaped\n`submit/fill/proof/finalise` refs above stay for back-compat; this list is what\nnon-escrow (router/composite/FX) orders render, and it is empty (not a wall of\n\"—\") when an order has no recorded transactions.", "items": { "$ref": "#/components/schemas/OrderTransactionInfo" }, "type": "array" }, "userDepositWallet": { "type": [ "string", "null" ] } }, "required": [ "status" ], "type": "object" }, "OracleInfo": { "description": "Oracle / cross-chain proof-relay metadata.", "properties": { "messageId": { "type": [ "string", "null" ] }, "name": { "type": "string" }, "status": { "type": [ "string", "null" ] } }, "required": [ "name" ], "type": "object" }, "OrderChannel": { "description": "New values may be added; treat unknown values as other.", "enum": [ "ui", "api", "whitelabel", "embedded" ], "type": "string", "x-extensible-enum": true }, "OrderComplianceCheck": { "description": "One compliance check that ran for the order.", "properties": { "chainId": { "description": "Chain the check was evaluated against, when on-chain.", "format": "int64", "minimum": 0, "type": [ "integer", "null" ] }, "contractAddress": { "description": "Contract the check was evaluated against (policy engine, escrow).", "type": [ "string", "null" ] }, "details": { "description": "One-line human summary recorded by the check.", "type": [ "string", "null" ] }, "enforced": { "description": "Whether the recorded mode enforced this check; false for unrecorded modes is\nnot a claim that the historical gate admitted its failures.", "type": "boolean" }, "evidence": { "description": "Structured evidence recorded by the check, secret-scrubbed." }, "group": { "$ref": "#/components/schemas/ComplianceCheckGroup" }, "groupReason": { "description": "An explanation based only on this row's recorded applicability and outcome.", "type": "string" }, "id": { "description": "Stable check identifier (`pretrade_checks.check_name`), e.g.\n`originator_sanctions`, `ace_policy_check`, `wallet_identity`.", "type": "string" }, "label": { "description": "Human label derived from `id`.", "type": "string" }, "latencyMs": { "format": "int64", "type": [ "integer", "null" ] }, "layer": { "$ref": "#/components/schemas/ComplianceLayer" }, "missingInput": { "description": "The input that was missing: verified_notional_usd, eur_usd_reference_rate or workspace_compliance_policy.", "type": [ "string", "null" ] }, "reasonCode": { "description": "Why a check could not be concluded: NOTIONAL_UNVERIFIED, REFERENCE_RATE_UNAVAILABLE or COMPLIANCE_POLICY_UNAVAILABLE, from its recorded evidence.", "type": [ "string", "null" ] }, "runMode": { "$ref": "#/components/schemas/ComplianceRunMode" }, "runModeReason": { "description": "Present only when a stored mode cannot be decoded; never a default mode.", "type": [ "string", "null" ] }, "source": { "description": "Provider or engine that produced the verdict (`pretrade_checks.data_source`).", "type": "string" }, "timestamp": { "format": "date-time", "type": "string" }, "txHash": { "description": "Transaction that commits the evidence, when one exists.", "type": [ "string", "null" ] }, "verdict": { "$ref": "#/components/schemas/ComplianceCheckVerdict" } }, "required": [ "id", "label", "layer", "verdict", "source", "timestamp", "runMode", "enforced", "group", "groupReason" ], "type": "object" }, "OrderComplianceDenialFact": { "description": "Typed denial metadata; withheld reasons require generic compliance-review copy.", "properties": { "code": { "type": "string" }, "fields": { "items": { "type": "string" }, "type": "array" }, "remedy": { "$ref": "#/components/schemas/ComplianceRemedy" }, "withheld": { "type": "boolean" } }, "required": [ "code", "remedy", "withheld" ], "type": "object" }, "OrderComplianceScope": { "description": "Whether the caller may read the recorded compliance details for this order.\n\nNew values may be added; treat unknown values as other.", "enum": [ "full", "verdictOnly" ], "type": "string", "x-extensible-enum": true }, "OrderComplianceSection": { "description": "The order's own compliance verdict and every check that ran for it, split into\non-chain and off-chain checks.", "properties": { "attestation": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/AceAttestationProof" } ] }, "checks": { "description": "Every check that ran, oldest first. Denying check first when denied.", "items": { "$ref": "#/components/schemas/OrderComplianceCheck" }, "type": "array" }, "corridor": { "description": "`\"->\"` when both are known.", "type": [ "string", "null" ] }, "denial": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/OrderComplianceDenialFact" } ] }, "denialReason": { "description": "Why the order was denied, when it was.", "type": [ "string", "null" ] }, "evaluatedAt": { "description": "When the gate evaluated the order (earliest recorded check).", "format": "date-time", "type": [ "string", "null" ] }, "notionalUsd": { "format": "double", "type": [ "number", "null" ] }, "onChainPolicy": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/OnChainCoverage", "description": "Whether an on-chain ACE policy run covers this order's transactions; it\nalways agrees with the workspace order-coverage audit.\n\n`null` and `noTxRecorded` are DIFFERENT facts: `null` means coverage could\nnot be determined for this response, while `noTxRecorded` means the order\ndeclares no transaction at all. Never read `null` as a finding about the order." } ] }, "scope": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/OrderComplianceScope" } ] }, "travelRule": { "$ref": "#/components/schemas/OrderTravelRuleStatus" }, "verdict": { "$ref": "#/components/schemas/ComplianceVerdict" }, "walletIdentity": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/OrderWalletIdentity" } ] } }, "required": [ "verdict", "checks", "travelRule" ], "type": "object" }, "OrderExecutionReport": { "description": "Flattened into both order kinds' envelopes: its keys are the envelope's own keys.", "properties": { "fees": { "description": "The fees actually charged, as recorded: the venue's own fee report, bridge fees, network\ngas the order's wallet paid, and the platform fee. Never a quoted estimate. A fee whose\namount was not reported or could not be read is left out rather than shown as 0, and its\nkind is listed in `unrecordedFees`.", "items": { "$ref": "#/components/schemas/OrderFee" }, "type": "array" }, "fills": { "description": "Each confirmed fill, in execution order. Always present: empty before any fill is\nconfirmed.", "items": { "$ref": "#/components/schemas/OrderFill" }, "type": "array" }, "quotedBuyAmount": { "description": "The buy amount the executed quote said would land. Null when it is not known (for\nexample before a venue order is dispatched).", "type": [ "string", "null" ] }, "settledBuyAmount": { "description": "What actually landed, read from the fill or settlement evidence. Null until it is\nmeasured; never the quote carried forward and never 0 for unknown.", "type": [ "string", "null" ] }, "settlesBy": { "description": "The latest time the order settles, or can no longer execute, under its recorded terms:\nthe signed order's fill deadline, or, on a route, the latest fill deadline every leg\ncommits to (Advanced); the last on-chain step's send-by time (an on-chain Basic swap).\nNull when no such term is recorded, for example a same-chain DEX swap, whose call\ncarries no deadline.", "format": "date-time", "type": [ "string", "null" ] }, "unrecordedFees": { "description": "Every fee kind the order incurs whose actual charge is not recorded or could not be\nread: a venue fee taken inside the price without an amount, a bridge leg's fee, gas\nthe order's wallet spent without a readable receipt, a platform fee billed off the\norder. Always present; empty only when every incurred charge is in `fees`. An absent\nkind with no `fees` line means nothing of that kind was charged. Open set: clients\nshow an unknown kind generically.", "items": { "$ref": "#/components/schemas/OrderFeeKind" }, "type": "array" } }, "required": [ "fills", "quotedBuyAmount", "settledBuyAmount", "fees", "unrecordedFees", "settlesBy" ], "type": "object" }, "OrderFailure": { "description": "Structured order failure details for programmatic polling clients.", "properties": { "code": { "description": "Stable coarse code for client branching.", "type": "string" }, "message": { "description": "The code's fixed, user-safe sentence. Never the executor's own error text.", "type": "string" }, "phase": { "$ref": "#/components/schemas/OrderFailurePhase", "description": "Lifecycle phase where the failure was observed." }, "recoveryStopped": { "description": "True when recovery has written this order off as permanently unrecoverable: it will\nnot be retried. False while recovery may still resume it.", "type": "boolean" } }, "required": [ "phase", "code", "message", "recoveryStopped" ], "type": "object" }, "OrderFailurePhase": { "description": "Transaction phase of a public order failure.\n\nNew values may be added; treat unknown values as other.", "enum": [ "prepare", "fill", "postFill", "preClaim", "claim" ], "type": "string", "x-extensible-enum": true }, "OrderFee": { "description": "One fee actually charged.", "properties": { "amount": { "description": "Decimal amount in `asset`.", "type": "string" }, "asset": { "type": "string" }, "chain": { "description": "The CAIP-2 chain the fee was paid on, for an on-chain charge.", "type": [ "string", "null" ] }, "includedInPrice": { "description": "True when the venue took this fee inside its price: the fill amounts already reflect\nit, so it is not charged on top of them.", "type": "boolean" }, "kind": { "$ref": "#/components/schemas/OrderFeeKind" } }, "required": [ "kind", "amount", "asset", "includedInPrice" ], "type": "object" }, "OrderFeeKind": { "description": "What a fee paid for.\n\nNew values may be added; treat unknown values as other.", "enum": [ "trading", "relayer", "forwarding", "transfer", "network", "platform" ], "type": "string", "x-extensible-enum": true }, "OrderFill": { "description": "One confirmed fill: what it delivered, what it spent and where.", "properties": { "amount": { "description": "The buy Asset amount this fill delivered. Null when the fill is confirmed but nothing\nmeasured its delivery.", "type": [ "string", "null" ] }, "at": { "description": "The recorded fill time: the venue's fill time or the time the fill transaction was\nobserved. Null when no fill time was recorded.", "format": "date-time", "type": [ "string", "null" ] }, "network": { "description": "The CAIP-2 chain of `txHash`; absent off-chain.", "type": [ "string", "null" ] }, "price": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/OrderFillPrice", "description": "The executed price in market convention (quote units per one base unit). Null when\neither amount is unknown." } ] }, "sellAmount": { "description": "The sell Asset amount this fill spent. Null when it was not recorded.", "type": [ "string", "null" ] }, "txHash": { "description": "The fill's or settlement's on-chain transaction; absent off-chain.", "type": [ "string", "null" ] }, "venue": { "$ref": "#/components/schemas/OrderFillVenue" } }, "required": [ "amount", "sellAmount", "price", "venue", "at" ], "type": "object" }, "OrderFillPrice": { "description": "An executed price: `amount` units of `quote` for one unit of `base`.", "properties": { "amount": { "type": "string" }, "base": { "type": "string" }, "quote": { "type": "string" } }, "required": [ "amount", "base", "quote" ], "type": "object" }, "OrderFillVenue": { "description": "The venue that executed the fill, by the same id and name its quote carried.", "properties": { "id": { "type": "string" }, "name": { "type": "string" } }, "required": [ "id", "name" ], "type": "object" }, "OrderGrantRefusal": { "description": "New values may be added; treat unknown values as other.", "enum": [ "GRANT_NOT_FOUND", "GRANT_NOT_ACTIVE", "GRANT_EXPIRED", "GRANT_REVOKED", "GRANT_USED", "ORDER_MISMATCH", "LEG_MISMATCH", "ENVELOPE_CHAIN_MISMATCH", "ENVELOPE_VERIFYING_CONTRACT_MISMATCH", "ENVELOPE_PRIMARY_TYPE_MISMATCH", "ENVELOPE_SPENDER_MISMATCH", "ENVELOPE_TOKEN_MISMATCH", "ENVELOPE_AMOUNT_EXCEEDED", "ENVELOPE_RECIPIENT_MISMATCH", "ENVELOPE_FUNDER_MISMATCH", "ENVELOPE_DEADLINE_EXCEEDED", "PROVIDER_REFUSED", "PROVIDER_UNCERTAIN" ], "type": "string", "x-extensible-enum": true }, "OrderLegExternalRef": { "description": "An off-chain provider reference for a leg.", "properties": { "kind": { "description": "Reference kind, e.g. `circleTradeId` | `acrossDepositId` | `relayRequestId`.", "type": "string" }, "url": { "description": "A provider status URL for `value`, when one is known.", "type": [ "string", "null" ] }, "value": { "type": "string" } }, "required": [ "kind", "value" ], "type": "object" }, "OrderLegInfo": { "description": "One executed (or pending) route leg.", "properties": { "buy": { "$ref": "#/components/schemas/AssetAmountDisplay", "description": "What the leg quote ESTIMATED this leg would buy. Always the quote: a confirmed\ndelivery is reported separately in `measuredBuy` rather than overwriting this,\nso the two facts stay distinguishable on the wire." }, "counterparty": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/LegCounterparty", "description": "Per-leg counterparty compliance posture — WHO filled this leg and their\nregulatory standing. Absent on the generic `OrderResponse`; populated only\non the admin company trade-detail. Lets a composite show \"leg 1 = KYB'd\nSolver X (Cayman Islands), leg 2 = CCTP protocol\" instead of one collapsed\ncounterparty." } ] }, "destChainId": { "format": "int64", "minimum": 0, "type": [ "integer", "null" ] }, "etaSeconds": { "description": "The route quote's per-leg ETA in seconds, when it carried one: the venue's\nestimate of this leg's own execution. For a CCTP leg it is the burn-to-mint\nupper bound of the chosen finality tier, set by the source chain (Fast ~20 s;\nStandard ~19 min from the L1-anchored chains). It never counts the time a\nparked route waits for its taker to sign the next leg.", "format": "int64", "minimum": 0, "type": [ "integer", "null" ] }, "externalRefs": { "description": "Off-chain provider references for the leg (Circle trade id, Across deposit id,\nRelay request id, …) — the identifiers a client uses to look the leg up on the\nprovider's own status surface.", "items": { "$ref": "#/components/schemas/OrderLegExternalRef" }, "type": "array" }, "feeUsd": { "description": "Concrete USD-denominated fee total for this leg. Absent when the route\nquote only carried spread/fee bps or a non-USD fee asset.", "format": "double", "type": [ "number", "null" ] }, "index": { "description": "0-indexed position in the route's execution order.", "format": "int32", "minimum": 0, "type": "integer" }, "kind": { "description": "Normalised leg mechanism: `cctp` | `across` | `relay` | `fx` | `solver`, or the\nraw `providerProduct` for a kind the backend does not special-case (clients must\ntreat this as an open set and fall back to a generic presentation).", "type": "string" }, "label": { "description": "Human-friendly leg label, e.g. `\"Circle CCTP Fast\"` or `\"CCTP: Base → Arc\"`.", "type": "string" }, "measuredBuy": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/AssetAmountDisplay", "description": "What this leg was OBSERVED to deliver, from the settlement receipt TetraFi\nrecorded for this leg, in the leg's buy asset. Absent until that receipt has\nconfirmed the leg, which a client must render as \"not measured\": never as\nzero, and never by silently showing `buy` in its place.\n\nThis is the only place an INTERMEDIATE leg's real delivery appears. On a\n`StableFX -> CCTP` composite the FX leg settles a different asset on a\ndifferent chain from the order's own output, so the order-level delivery\ncannot describe it." } ] }, "measuredBuySource": { "description": "Which settlement receipt backed `measuredBuy`: `circleSettledOutput`\n| `cctpVerifiedOutput` | `relayVerifiedOutput` | `solverVerifiedOutput`\n| `nativeUniswapOutcome`. Carried so an operator can trace a per-leg number back\nto the observation that produced it instead of inferring it from the leg kind.", "type": [ "string", "null" ] }, "product": { "description": "The venue product of a firm-RFQ leg: `lop` (Octarine limit order) | `rfq` (Bebop\nPMM RFQ) | `bopamm` (Bebop BopAMM). Read from the handoff persisted for the leg,\nso it is absent until the venue firmed it and on every non-RFQ leg. An open set:\na client renders an unknown value generically.", "type": [ "string", "null" ] }, "provider": { "description": "Venue / provider display name for the leg.", "type": [ "string", "null" ] }, "sell": { "$ref": "#/components/schemas/AssetAmountDisplay", "description": "What the leg sells: its asset, chain and `decimalAmount`, or `unresolved` when\nthe backend cannot scale it." }, "sourceChainId": { "format": "int64", "minimum": 0, "type": [ "integer", "null" ] }, "status": { "description": "Leg status: `pending` | `executing` | `done` | `failed` | `refunded`.", "type": "string" }, "tradeLeg": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/TradeLegFacts", "description": "The money-movement facts of a hosted venue trade's leg: a\npayout or pay-in over a bank rail or a chain. Absent on route legs." } ] }, "transactions": { "description": "The transactions this leg produced (a subset of the order's `transactions[]`,\ncorrelated by `leg_index`/chain), each already enriched with an explorer URL.", "items": { "$ref": "#/components/schemas/OrderTransactionInfo" }, "type": "array" }, "venueRouteId": { "description": "The venue route identity that filled this leg, from the retained route quote's\n`legQuotes[].solverId`. A solver-LP leg carries a real solver id that\nresolves to a KYB'd LP workspace; a bridge leg carries a synthetic id\n(e.g. `\"circle-cctp\"`) with no LP workspace behind it. This is the handle\nthe trade-detail builder uses to resolve per-leg counterparty compliance.", "type": [ "string", "null" ] } }, "required": [ "index", "kind", "label", "sell", "buy", "status" ], "type": "object" }, "OrderListKind": { "description": "Which native owner holds an order.", "enum": [ "basicTrade", "advancedTrade" ], "type": "string" }, "OrderListResponse": { "description": "A page of the workspace's orders, newest first. A status filter keeps reading until the page\nhas `limit` items or the orders end, within a bounded scan: a page shorter than `limit` with a\n`nextCursor` means that scan reached its limit (`scanLimitReached`), never that the orders ended.", "properties": { "items": { "items": { "$ref": "#/components/schemas/QuoteOrderResponse" }, "type": "array" }, "nextCursor": { "type": [ "string", "null" ] }, "scanLimitReached": { "description": "True when a status-filtered page stopped at its scan limit before filling `limit`:\nmore orders remain to examine, so follow `nextCursor`. False on every other page.", "type": "boolean" } }, "required": [ "items", "scanLimitReached" ], "type": "object" }, "OrderRecordsScope": { "description": "Access to the order's workspace trade records, using the detail/timeline rule.\n\nNew values may be added; treat unknown values as other.", "enum": [ "full", "orderOnly" ], "type": "string", "x-extensible-enum": true }, "OrderResponse": { "description": "Response body for /api/v1/orders endpoint (order submission)", "properties": { "bondReservation": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/BondReservation", "description": "The hub bond reservation backing a bonded RFQ order: its lifecycle status and reserve amount. Absent for non-bonded orders." } ] }, "compliance": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/OrderComplianceSection", "description": "The order's own compliance verdict and every check that ran, split\non-chain / off-chain. Readable by whoever may read the order; workspace\nBI stays on the trade-detail endpoint. Absent when the compliance\nverdict could not be read for this response." } ] }, "continuationPlan": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/ContinuationPlan", "description": "How each leg after the first runs and where its funds wait if it cannot. Absent\nfor single-leg orders." } ] }, "createdAt": { "description": "When the response was created", "format": "date-time", "type": "string" }, "custodySigningError": { "description": "Why custody signing failed, readable by the user and operators, when\n`custodySigningStatus` is `failed` / `failed_unreachable`; absent otherwise.", "type": [ "string", "null" ] }, "custodySigningStatus": { "description": "Custody-signing status for orders a custody provider signs (Fireblocks / BitGo /\nDFNS / Copper): `pending` (submitted to the provider, awaiting its signature),\n`signed`, `failed`, or `failed_unreachable` (the provider neither called back nor\nanswered a status check in time). Absent for orders that are not custody-signed.", "type": [ "string", "null" ] }, "custodyVaultAddress": { "description": "Custody vault that signed a backend-signed order (`orders.custody_vault_address`).", "type": [ "string", "null" ] }, "deliveredBuy": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/AssetAmountDisplay", "description": "What the settlement evidence says was ACTUALLY delivered, in the order's\nbuy asset: its symbol, decimals, chain and `decimalAmount`, or `unresolved`.\n`route.buy` is what the quote promised; this is the delivery. Absent when\nnothing has been captured yet (the order has not settled). Never guessed\nfrom the quote: read `deliveredBuyProvenance` before rendering it." } ] }, "deliveredBuyProvenance": { "description": "Where `deliveredBuy` came from: `\"measured\"` when it was read\nback from settlement evidence (a receipt-backed bridge delivery, a\nrealized DEX output, a Circle-settled FX output, a deferred settlement's\nexecuted amount), `\"quoted\"` when a quote-time value was carried forward\nbecause nothing measured the delivery.\n\nThis field is the whole point of the pair. The lifecycle falls back to\nthe quoted output when no measurement exists, which makes \"measured,\nzero slippage\" and \"never measured\" byte-identical — `realizedSlippageBps`\nreads 0 for both and `deliveredBuy` repeats the quote. A client\nthat renders a delivered amount without reading this is reporting a\nquote as a receipt.", "type": [ "string", "null" ] }, "directUserId": { "description": "Broker-onboarded direct user this order was submitted for.", "type": [ "string", "null" ] }, "executionDeadlineAt": { "description": "Deadline by which execution had to complete before the TTL watchdog\nmarks the order expired (`orders.execution_deadline_at`).", "format": "date-time", "type": [ "string", "null" ] }, "executionDeadlineKind": { "description": "Why `executionDeadlineAt` exists: `enforced` (configured SLA) or the\nproduct default (`orders.execution_deadline_kind`).", "type": [ "string", "null" ] }, "failure": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/OrderFailure", "description": "Structured failure details when status is failed." } ] }, "feeOutputs": { "description": "The order's further signed outputs after `route.buy`, in order: the platform\nfee paid to its collector on an order that carries one. Each names its asset,\nchain and `decimalAmount`, or `unresolved`. Empty when the order has a single\noutput.", "items": { "$ref": "#/components/schemas/AssetAmountDisplay" }, "type": "array" }, "feeUsd": { "description": "Total fee paid by the user in USD (`orders.fee_usd`).", "format": "double", "type": [ "number", "null" ] }, "fillTransaction": { "description": "Fill transaction information" }, "filledAt": { "description": "When the fill transaction was observed (`orders.filled_at`).", "format": "date-time", "type": [ "string", "null" ] }, "legAttempts": { "additionalProperties": { "items": { "$ref": "#/components/schemas/LegAttempt" }, "type": "array" }, "description": "Ended attempts per leg of a multi-leg route, keyed by leg index. The attempt in\nprogress is the number of ended attempts plus one. Absent until a leg has ended\nan attempt.", "propertyNames": { "format": "int32", "minimum": 0, "type": "integer" }, "type": [ "object", "null" ] }, "legs": { "description": "Uniform per-leg execution model for multi-leg route orders: one entry per\nstep of the route, in execution order. Absent for single-leg escrow / deferred orders, whose\n`transactions[]` timeline is the whole story. Leg status is projected from\nthe route cursor and can temporarily trail a mined transaction; correlate\nit with `transactions[]` and provider references before treating `pending`\nas evidence that execution did not occur.", "items": { "$ref": "#/components/schemas/OrderLegInfo" }, "type": [ "array", "null" ] }, "lifecycleStatus": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/TradeLifecycleStatus", "description": "The same server-owned lifecycle status the trade list carries." } ] }, "linkedWalletId": { "description": "Linked wallet used for settlement. Absent for older orders.", "type": [ "string", "null" ] }, "nextAction": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/NextAction", "description": "What this multi-leg order needs from its reader next: sign the next leg, accept a\nmoved price, retry a leg that did not run, finish the trade, or nothing because it\nstopped or is under review. Absent when nothing is needed. Computed by the backend\nfrom the route's durable state; clients switch on `kind` and never infer it from\n`substatus`, which keeps its own meaning." } ] }, "nextActions": { "description": "Follow-up signed actions the client must perform after submit (e.g. the\nCircle StableFX Permit2 funding signature). Empty for single-step orders.\nTerminal orders and consumed or expired composite permits expose no action.\nClients must still submit the exact permit and retain it for idempotent retries.", "items": { "$ref": "#/components/schemas/PreflightNextAction" }, "type": "array" }, "nextActor": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/NextActor", "description": "Who must act next, including follow-up signatures visible only on the order read." } ] }, "orderId": { "description": "The order ID", "type": "string" }, "orderKind": { "description": "Canonical, route-aware order kind for status/history + SDK clients\n(`cctp-v0` / `across-v4` / `relay-v0` / `fx-v0` / `composite-v0` / `escrow-v0` /\n`deferred` / …). Always present. Prefer this over `order_type`, which collapses\nroutes to `generic-v0`.", "type": "string" }, "orderType": { "description": "Order type (e.g., \"escrow-v0\", \"eip3009-v0\", \"resource-lock-v0\")", "type": "string" }, "pairQuoteId": { "description": "The held pair-quote id (`q_…`) the order was placed by (`POST /orders {quoteId}`):\nthe id Review and the quote card showed. `quoteId` above is the executable quote the\norder ran on, which can differ. Recorded server-side from the held quote, never from the\nrequest; absent for orders placed with a full quote body and for orders placed before\nit was recorded.", "type": [ "string", "null" ] }, "quoteId": { "description": "Quote ID", "type": [ "string", "null" ] }, "realizedSlippageBps": { "description": "Realized adverse slippage in basis points, computed at settlement as\n`10000 * (quoted_output - delivered_output) / quoted_output`. Negative\nmeans the delivery beat the quote.\n\nDeliberately NOT named `slippageBps`: this response already carries\n`slippageToleranceBps`, which is the tolerance the order was SUBMITTED\nwith — a quote-time input, not an outcome. Two fields one word apart\nthat mean \"what I allowed\" and \"what I got\" is how a caller ends up\ncharting the limit as the result, so the outcome names itself.\n\nOnly meaningful alongside `deliveredBuyProvenance == \"measured\"`; a\n`\"quoted\"` provenance makes this structurally 0.", "format": "int32", "type": [ "integer", "null" ] }, "recipientAddress": { "description": "Wallet that receives the output: the fill's recipient when known, else\nthe signed intent / route preview receiver. A workspace-router proxy is\nreported as-is; it forwards to the taker at settlement.", "type": [ "string", "null" ] }, "reporting": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/ReportingCoverage", "description": "Optional reporting guidance; never changes order execution status." } ] }, "route": { "$ref": "#/components/schemas/TradeRouteDisplay", "description": "What the order sells (`route.sell`) and buys (`route.buy`): the asset's\nsymbol, name, decimals and chain, the base-unit amount and the amount\nscaled by those decimals (`decimalAmount`). These are the amounts the\naccepted quote committed; `deliveredBuy` reports delivery.\n\nWhen TetraFi cannot resolve a side, `decimalAmount` is absent and\n`unresolved` names why (`assetNotInRegistry`, `amountUnavailable`), so a\nclient renders an explicit unresolved state and never scales base units\nitself." }, "senderAddress": { "description": "Wallet that funds the order: the signed intent's depositor (escrow /\neip3009 message `sponsor` / `user` / `signer` / `from`), the route\npreview's input owner, or the StableFX taker. Absent when the order\nrecorded none.", "type": [ "string", "null" ] }, "settledAt": { "description": "When the order settled / finalized (`orders.settled_at`).", "format": "date-time", "type": [ "string", "null" ] }, "settlement": { "$ref": "#/components/schemas/Settlement", "description": "Settlement information" }, "settlementSpeedMs": { "description": "`settled_at - created_at` in milliseconds, captured at settlement.", "format": "int64", "type": [ "integer", "null" ] }, "slippageToleranceBps": { "description": "Client-selected slippage tolerance in basis points: the deferred/OTC submit\ntolerance, or for a multi-leg route the tolerance each continuation re-quote may\nabsorb (the quote request's `intent.metadata.allowedSlippageBps`, default 30).", "format": "double", "type": [ "number", "null" ] }, "status": { "$ref": "#/components/schemas/OrderStatus", "description": "Coarse current status of the order. Terminality is order-kind dependent:\nroute and atomic venue orders normally complete at `settled`, while\nclaim-based or deferred products may continue to `finalized`. Use\n`substatus` for the route/provider state and do not wait for `finalized`\nunconditionally." }, "stuckSince": { "description": "Last update of a nonterminal order that is stuck waiting on its counterparty.", "format": "date-time", "type": [ "string", "null" ] }, "substatus": { "description": "Finer-grained state within `status`, when one applies. Route orders surface the\n`routeStatus` (`bridging` / `arrived` / `manualReview` / …); escrow/deferred\norders surface the fine wire states the coarse `status` hides (`postFilled` / …).", "type": [ "string", "null" ] }, "substatusCode": { "description": "Machine-readable reason for the current `substatus`, when the client needs\nto choose a recovery action without parsing `substatusMessage`.", "type": [ "string", "null" ] }, "substatusMessage": { "description": "Human-readable elaboration of `substatus` (e.g. a Circle StableFX status line).", "type": [ "string", "null" ] }, "terminal": { "description": "Whether the order lifecycle is terminal and cannot advance any further.\nThis is computed by the backend from the product-specific state machine;\nclients should poll this field instead of inferring terminality from the\ncoarse `status` or `substatus` vocabulary.", "type": "boolean" }, "timing": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/OrderTiming", "description": "Descriptive stage estimates and server-observed clocks. Never an execution deadline." } ] }, "transactions": { "description": "Best-effort transaction references for observed lifecycle stages, enriched at\nserve time with `label` + `explorerUrl` + `legIndex`. Projection can lag the\nchain/provider; absence is not proof that no transaction was submitted.", "items": { "$ref": "#/components/schemas/OrderTransactionInfo" }, "type": "array" }, "updatedAt": { "description": "When the response was last updated", "format": "date-time", "type": "string" }, "venueRouteId": { "description": "The venue route identity that fills the order, not the catalogue Venue id.\nRuntime solver identities and router/composite sentinels are retained verbatim.", "type": [ "string", "null" ] }, "viewer": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/OrderViewer", "description": "Caller-relative ownership and records visibility, absent when membership is unknown." } ] }, "workspaceId": { "description": "Workspace that placed this order. Absent for older orders and for orders placed\nwith an API key.", "type": [ "string", "null" ] } }, "required": [ "orderId", "status", "terminal", "createdAt", "updatedAt", "orderType", "settlement" ], "type": "object" }, "OrderStageTiming": { "properties": { "clockState": { "description": "pending | running | waitingForUser | stopped | unknown", "type": "string" }, "context": { "type": "string" }, "elapsedSeconds": { "description": "Automated elapsed time at OrderTiming.observedAt; absent for incomplete history.", "format": "double", "type": [ "number", "null" ] }, "endedAt": { "format": "date-time", "type": [ "string", "null" ] }, "estimateKind": { "description": "calculated | measured | rough | milestone | unavailable", "type": "string" }, "expectedSeconds": { "format": "int64", "minimum": 0, "type": [ "integer", "null" ] }, "key": { "description": "Semantic identity, independent of translated labels and rail positions.", "type": "string" }, "legIndex": { "format": "int32", "minimum": 0, "type": [ "integer", "null" ] }, "operation": { "type": "string" }, "startedAt": { "format": "date-time", "type": [ "string", "null" ] }, "waitingSince": { "format": "date-time", "type": [ "string", "null" ] } }, "required": [ "key", "operation", "context", "estimateKind", "clockState" ], "type": "object" }, "OrderStatus": { "description": "Coarse public lifecycle status. Failure detail belongs only to `failure`.\n\nNew values may be added; treat unknown values as other.", "enum": [ "created", "pending", "executing", "executed", "settled", "settling", "finalized", "failed", "refunded" ], "type": "string", "x-extensible-enum": true }, "OrderTiming": { "properties": { "observedAt": { "format": "date-time", "type": "string" }, "revision": { "type": "string" }, "stages": { "items": { "$ref": "#/components/schemas/OrderStageTiming" }, "type": "array" } }, "required": [ "observedAt", "revision", "stages" ], "type": "object" }, "OrderTransactionActor": { "description": "Actor that submitted a lifecycle transaction.\n\nNew values may be added; treat unknown values as other.", "enum": [ "user", "solver", "system" ], "type": "string", "x-extensible-enum": true }, "OrderTransactionChainRole": { "description": "Chain role for a lifecycle transaction.\n\nNew values may be added; treat unknown values as other.", "enum": [ "origin", "destination", "junction" ], "type": "string", "x-extensible-enum": true }, "OrderTransactionInfo": { "description": "A transaction in an order's timeline, for one lifecycle stage.\n\n`legIndex`, `label` and `explorerUrl` are optional: they tell a client which route\nleg the transaction belongs to, a human role label, and a ready-to-open explorer URL.", "properties": { "actor": { "$ref": "#/components/schemas/OrderTransactionActor" }, "chainId": { "format": "int64", "minimum": 0, "type": "integer" }, "chainRole": { "$ref": "#/components/schemas/OrderTransactionChainRole" }, "explorerUrl": { "description": "Block-explorer URL for `hash` on `chainId` when TetraFi knows the chain's explorer;\nwhen absent, the client falls back to its own per-chain explorer list.", "type": [ "string", "null" ] }, "hash": { "type": "string" }, "label": { "description": "Human-friendly role label (e.g. \"Bridge burn\", \"Fill\", \"Claim\"); when absent\nthe client derives it from `stage`.", "type": [ "string", "null" ] }, "legIndex": { "description": "0-indexed route leg this tx belongs to (multi-leg routes only).", "format": "int32", "minimum": 0, "type": [ "integer", "null" ] }, "stage": { "$ref": "#/components/schemas/OrderTransactionStage" }, "status": { "$ref": "#/components/schemas/OrderTransactionStatus" }, "timestamp": { "description": "Unix seconds at which the platform OBSERVED this transaction: when TetraFi\nrecorded it, never the block time.\n\nAbsent when TetraFi does not know when the transaction happened. A client\nmust render \"time unknown\" then, never substitute a time of its own (such as\nthe order's `updatedAt`).", "format": "int64", "minimum": 0, "type": [ "integer", "null" ] } }, "required": [ "stage", "hash", "chainId", "chainRole", "actor", "status" ], "type": "object" }, "OrderTransactionStage": { "description": "Order lifecycle stage that a transaction belongs to.\n\nNew values may be added; treat unknown values as other.", "enum": [ "prepare", "fill", "post_fill", "pre_claim", "claim", "bridging", "arrived", "refund" ], "type": "string", "x-extensible-enum": true }, "OrderTransactionStatus": { "description": "Transaction status for an order lifecycle stage.\n\nNew values may be added; treat unknown values as other.", "enum": [ "pending", "executed", "failed" ], "type": "string", "x-extensible-enum": true }, "OrderTravelRuleStatus": { "description": "Travel-rule status snapshot for the order.", "properties": { "required": { "description": "When applicability is undetermined, `false` is not a claim that the\nrule is unnecessary; clients must read `status`.", "type": "boolean" }, "status": { "description": "`not_required` | `required` | `transmitted` | `not_recorded`.", "type": "string" }, "transmitted": { "type": "boolean" } }, "required": [ "status", "required", "transmitted" ], "type": "object" }, "OrderTxRef": { "description": "A transaction an order declares, plus WHICH field declared it.\n\n`source` is load-bearing: a hash reached through\n`settlement.data.route.legs[1].transactionHash` is a different leg of the\norder from `orders.submit_tx_hash`, and a coverage gap on one says\nnothing about the other.", "properties": { "chainId": { "description": "Chain declared alongside the hash, when the declaring object also\ndeclares one. Absent means the settlement did not say — NOT \"chain\nzero\" and not \"same chain as the order\".", "format": "int64", "minimum": 0, "type": [ "integer", "null" ] }, "source": { "description": "Dotted path of the field that declared this hash, e.g.\n`orders.submit_tx_hash` or `settlement.data.directDexExecution.transactionHash`.", "type": "string" }, "transactionHash": { "description": "Lowercase `0x`-prefixed 32-byte hash.", "type": "string" } }, "required": [ "transactionHash", "source" ], "type": "object" }, "OrderViewer": { "description": "Caller-relative context for an authenticated read of a workspace-tagged order.", "properties": { "recordsScope": { "$ref": "#/components/schemas/OrderRecordsScope" }, "submittedByYou": { "description": "The caller owns the linked wallet or is the order's recorded submitting user.", "type": "boolean" } }, "required": [ "submittedByYou", "recordsScope" ], "type": "object" }, "OrderWalletIdentity": { "description": "The wallet-identity binding proven at admission.", "properties": { "address": { "type": "string" }, "chainFamily": { "description": "`evm` | `solana` | `tron` | … as the linked-wallet registry records it.", "type": [ "string", "null" ] }, "linkedAt": { "format": "date-time", "type": [ "string", "null" ] }, "method": { "description": "`siwe` | `siws` | `custody`.", "type": "string" } }, "required": [ "address", "method" ], "type": "object" }, "OwnBankVerification": { "properties": { "credit": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/OwnBankVerifiedCredit" } ] }, "lastGoodReadAt": { "format": "date-time", "type": [ "string", "null" ] }, "matchedBy": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/OwnBankVerificationMatchedBy" } ] }, "reason": { "type": [ "string", "null" ] }, "reviewItemId": { "type": [ "string", "null" ] }, "source": { "$ref": "#/components/schemas/OwnBankVerificationSource" }, "state": { "$ref": "#/components/schemas/OwnBankVerificationState" } }, "required": [ "state", "source" ], "type": "object" }, "OwnBankVerificationMatchedBy": { "description": "New values may be added; treat unknown values as other.", "enum": [ "referenceAndAmount", "amountAndWindow" ], "type": "string", "x-extensible-enum": true }, "OwnBankVerificationSource": { "description": "New values may be added; treat unknown values as other.", "enum": [ "revolutBusiness" ], "type": "string", "x-extensible-enum": true }, "OwnBankVerificationState": { "description": "New values may be added; treat unknown values as other.", "enum": [ "verified", "notSeen", "unavailable", "disagreement" ], "type": "string", "x-extensible-enum": true }, "OwnBankVerifiedCredit": { "properties": { "amount": { "description": "Exact decimal text, never a floating-point approximation.", "type": "string" }, "creditedAt": { "format": "date-time", "type": "string" }, "currency": { "type": "string" }, "referenceMasked": { "type": [ "string", "null" ] } }, "required": [ "amount", "currency", "creditedAt" ], "type": "object" }, "OwnedSolverIdentity": { "description": "Minimal owned identity for historical LP reads. No connection configuration,\ncredentials, routing grants or counterparty identities are disclosed.", "properties": { "name": { "type": [ "string", "null" ] }, "retiredAt": { "format": "date-time", "type": [ "string", "null" ] }, "solverId": { "type": "string" }, "status": { "$ref": "#/components/schemas/SolverStatus" } }, "required": [ "solverId", "status" ], "type": "object" }, "PaginatedWebhookDeliveries": { "description": "Paginated webhook deliveries response.", "properties": { "items": { "items": { "$ref": "#/components/schemas/WebhookDelivery" }, "type": "array" }, "page": { "minimum": 0, "type": "integer" }, "pageSize": { "minimum": 0, "type": "integer" }, "retention": { "$ref": "#/components/schemas/WebhookDeliveryRetention" }, "totalCount": { "minimum": 0, "type": "integer" } }, "required": [ "retention", "items", "totalCount", "page", "pageSize" ], "type": "object" }, "PairQuote": { "allOf": [ { "$ref": "#/components/schemas/CardFirmness", "description": "The card's firmness, written as `firm` and `lastLook`." }, { "anyOf": [ { "$ref": "#/components/schemas/ResolvedTradingSource" }, { "not": { "anyOf": [ { "required": [ "tradingSource" ] }, { "required": [ "fundingModel" ] }, { "required": [ "settlement" ] }, { "required": [ "fundingAccount" ] }, { "required": [ "deliverTo" ] } ] } } ] }, { "properties": { "advisories": { "description": "Competing mechanisms' limitations remain visible even when one serves.", "items": { "$ref": "#/components/schemas/RfqMechanismAdvisory" }, "type": "array" }, "assurance": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/QuoteAssurance", "description": "The bond backing the quote, separate from its firmness; null when unbonded." } ] }, "basis": { "$ref": "#/components/schemas/QuoteBasis", "description": "Where the price came from: a live venue quote, published levels, or a model." }, "buy": { "$ref": "#/components/schemas/QuoteSide", "description": "What the taker buys: `buy.amount` is what lands at `deliverTo`, after every\n`included: true` fee taken in the bought Asset." }, "corridors": { "description": "The venue's other supported corridors; changing one is a Requote.", "items": { "$ref": "#/components/schemas/QuoteCorridor" }, "type": "array" }, "eta": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/IsoDuration", "description": "Expected time to delivery (ISO 8601 duration); null when the venue states none." } ] }, "expiresAt": { "description": "When an executable quote stops being orderable; null for an indicative one (see `staleAfter`).", "format": "date-time", "type": [ "string", "null" ] }, "failureHandling": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/QuoteFailureHandling", "description": "What happens to the input if execution fails, as the venue reports it." } ] }, "fees": { "description": "Every fee line, its payer and whether `buy.amount` already includes it; an amount that could\nnot be read is null, never 0.", "items": { "$ref": "#/components/schemas/QuoteFee" }, "type": "array" }, "firmAsk": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/FirmAsk", "description": "When this card's venue gives its binding price, from the venue's own declaration:\n`onRequest` (a desk is firm-asked by Get firm quote or a requote) or `atExecution`\n(the venue prices firm only when the order executes, so Get firm quote is not offered).\nAbsent when no venue declares it (protocol routes, order books, fiat venues)." } ] }, "firmAskAvailableAt": { "description": "When this desk takes its next firm ask: its firm-quote limit for this workspace is reached\nuntil then, so Get firm quote and an order-time ask are refused before it. Absent\nwhen no limit is known here; the desk's admission still decides at ask time.", "format": "date-time", "type": [ "string", "null" ] }, "firmQuoteDailyWarning": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/FirmQuoteDailyWarning", "description": "Current workspace/venue firm asks, read without contacting the provider." } ] }, "id": { "description": "The held quote's id (`q_` + ULID): order it with `POST /orders {quoteId}`, preflight it with\n`POST /orders/preflight {quoteId}`, requote it with `POST /quotes {requote: id}`. It belongs to the\nprincipal that asked; another principal reads it as unknown (404).", "type": "string" }, "legs": { "description": "One leg per venue the quote runs through, in execution order: a multi-leg route (for example\nCCTP then Circle StableFX) lists each leg's venue and location.", "items": { "$ref": "#/components/schemas/QuoteLeg" }, "type": "array" }, "location": { "$ref": "#/components/schemas/QuoteLocation", "description": "Where the quote executes, derived from its legs." }, "maxPay": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/DecimalAmount", "description": "The most `sell.amount` a venue card asked by `buyAmount` may debit: the mirror of `minOut`, the quoted\ndebit grown by `priceProtectionBps`. It is the consent an order on it carries, so Confirm's\none fresh quote of an expired card is judged by it. Absent when asked by `sellAmount`." } ] }, "mechanism": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/RfqMechanism", "description": "The native mechanism that actually supplied this venue's price." } ] }, "minOut": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/DecimalAmount", "description": "The least `buy.amount` execution may deliver (from `priceProtectionBps`)." } ] }, "minReceiveRequired": { "description": "Whether `POST /orders` requires `minReceive` for this card. A held firm offer\nalready supplies confirmation; other within-limit cards need the caller's minimum.", "type": "boolean" }, "netReceived": { "$ref": "#/components/schemas/NetReceived", "description": "`buy.amount` minus every other cost, converted at the Reference mid: for\ncomparison and sort only, never what lands." }, "next": { "$ref": "#/components/schemas/QuoteNextAction", "description": "The caller's next call: `preflight` (protocol), `order`, `requote` (a production venue's indicative\ncard: its firm quote comes from a requote), or what to fix first." }, "observedAt": { "description": "When the price was observed: an indicative price, or the book read an executable\norder-book estimate (one that reprices when chosen) was priced from; null for a firm quote.", "format": "date-time", "type": [ "string", "null" ] }, "readiness": { "$ref": "#/components/schemas/Readiness", "description": "Whether the quote can be ordered now (funding, gas, wallet); an unknown is `unavailable`, never 0." }, "refundClaimableAfter": { "description": "With `refundOnSource` on an escrowed intent: the instant after which the source-chain\nescrow refunds the input if the order was not filled, read from the signed order's own\nexpiry (`expires`). Until then the input stays in that escrow. Absent when the quote holds\nno escrowed intent or its expiry could not be read; never estimated.", "format": "date-time", "type": [ "string", "null" ] }, "requoteOf": { "description": "The quote this one requoted (`POST /quotes {requote}`); the original stays orderable until its own\nexpiry, and a route's requote is that same route.", "type": [ "string", "null" ] }, "retainUntil": { "description": "The last instant this held quote can still be requoted, or ordered where its lapse\nallows it: its lapse plus the requote window (10 minutes), or the recovery window\n(30 minutes) for a protocol quote. After it, requote and order answer 410\n`REQUOTE_WINDOW_CLOSED` with `next: search` (request quotes again); before it, an\norder past the quote's lapse answers 410 `QUOTE_EXPIRED` with `next: requote`. Read from the held quote's own retention, never computed by a client;\nabsent when that instant is not representable.", "format": "date-time", "type": [ "string", "null" ] }, "screening": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/QuoteScreening", "description": "The bound wallet's screening state; null when no wallet is bound." } ] }, "sell": { "$ref": "#/components/schemas/QuoteSide", "description": "What the taker sells: Asset, chain (null off-chain), variant and amount in Asset units." }, "signaturesRequired": { "description": "Every signature the order needs. `next.sign` carries the first; later ones arrive\non the order as `signNextLeg`.", "format": "int32", "minimum": 0, "type": [ "integer", "null" ] }, "sizeLimits": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/VenueRfqSizeObservation", "description": "Provider bounds retained with this answer, never a current admission grant." } ] }, "sourceOptions": { "items": { "$ref": "#/components/schemas/SourceOption" }, "type": "array" }, "sourceRefusal": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/QuoteTradingSourceRefusal" } ] }, "spreadFromMidBps": { "$ref": "#/components/schemas/SpreadFromMid", "description": "The price's distance from the Reference mid, or the reason it is unknown." }, "staleAfter": { "description": "When an indicative price goes stale; null for an executable quote.", "format": "date-time", "type": [ "string", "null" ] }, "unspent": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/UnspentPay", "description": "What a card asked by `sellAmount` leaves unspent of the amount asked: an order book fills whole\nlots, so the card spends less and the rest stays where it is paid from. Absent when the card\nspends the whole amount." } ] }, "walletSelection": { "additionalProperties": { "$ref": "#/components/schemas/QuoteWalletSelection" }, "description": "Why each Basic on-chain wallet was selected. Response metadata, never request authority.", "propertyNames": { "description": "A CAIP-2 chain id (`eip155:8453`, `solana:`, `tron:shasta`), syntax-checked:\na namespace of 3 to 8 lowercase letters, digits or `-`, and a reference of 1 to 32\nletters, digits, `-` or `_`. Compared exactly, as CAIP-2 references are case-sensitive.", "example": "eip155:8453", "type": "string" }, "type": "object" } }, "required": [ "advisories", "assurance", "basis", "buy", "corridors", "eta", "expiresAt", "failureHandling", "fees", "id", "legs", "location", "minOut", "minReceiveRequired", "netReceived", "next", "observedAt", "readiness", "requoteOf", "screening", "sell", "signaturesRequired", "sourceOptions", "spreadFromMidBps", "staleAfter" ], "type": "object" } ], "description": "One venue's quote for the pair. Every field is always present; one that does not\napply to the quote's firmness is `null`:\n\n| field | indicative | executable, firm | executable, non-firm |\n|---|---|---|---|\n| `firm` | false | true | false |\n| `expiresAt` | null | set | set |\n| `minOut` | null | null | set |\n| `observedAt`, `staleAfter` | set | null | null |\n\nA stub (`sources[].priceOnRequest`) is indicative with `null` amounts.\n\nThe example is an executable non-firm quote: 10000 USDC paid,\n`buy.amount` 9996.0 USDT lands after the included 4.0 USDT provider fee;\n`netReceived` 9994.8 also subtracts the 0.0004 ETH network fee the taker pays\nseparately (`included: false`, about 1.2 USDT at the Reference mid), so it is lower\nthan `buy.amount`; `minOut` 9966.01 (30 bps) bounds `buy.amount`, not\n`netReceived`.", "example": { "advisories": [], "assurance": null, "basis": "liveQuote", "binding": { "deliverTo": { "address": "0x1111111111111111111111111111111111111111", "chain": "eip155:8453", "kind": "address" }, "wallets": { "eip155:42161": "lw_01JAX" } }, "bindingOptions": [], "buy": { "amount": "9996.0", "asset": "USDT", "chain": "eip155:8453", "variant": { "kind": "native", "name": "USDT" } }, "corridors": [ { "from": "eip155:1", "to": "eip155:8453" } ], "eta": "PT40S", "expiresAt": "2026-10-17T10:01:00Z", "failureHandling": "refundOnSource", "fees": [ { "amount": "4.0", "asset": "USDT", "chain": null, "included": true, "kind": "provider", "leg": 0, "paidBy": "taker" }, { "amount": "0.0004", "asset": "ETH", "chain": "eip155:42161", "included": false, "kind": "network", "leg": 0, "paidBy": "taker" } ], "firm": false, "id": "q_01JAY7Q5M3ZK8V2N4R6T8W0XYB", "lastLook": false, "legs": [ { "expectedArrival": null, "fundingModel": null, "location": { "from": "eip155:42161", "kind": "crossChain", "to": "eip155:8453" }, "venue": { "id": "tetrafi-solver", "logoUrl": null, "modality": "solver", "name": "TetraFi Solver", "protocolVersion": null } } ], "location": { "kind": "crossChain" }, "minOut": "9966.01", "minReceiveRequired": false, "netReceived": { "amount": "9994.8", "kind": "known" }, "next": { "kind": "sign", "typedData": {} }, "observedAt": null, "readiness": { "kind": "ready" }, "requoteOf": null, "screening": "screened", "sell": { "amount": "10000", "asset": "USDC", "chain": "eip155:42161", "variant": { "kind": "native", "name": "USDC" } }, "signaturesRequired": 1, "spreadFromMidBps": { "bps": 6, "kind": "known" }, "staleAfter": null } }, "PairQuoteRequest": { "additionalProperties": false, "description": "The public fresh `POST /quotes` body: what the taker sells and buys, and exactly one of\n`sellAmount` (an exact-in quote) or `buyAmount` (an exact-out quote). Everything else\nrefines it.", "properties": { "buy": { "$ref": "#/components/schemas/QuoteSideRequest", "description": "The Asset the taker buys, and optionally its chain." }, "buyAmount": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/DecimalAmount", "description": "The exact amount to buy, a positive decimal string in Asset units. Exactly one of\n`sellAmount` and `buyAmount`." } ] }, "deliverTo": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/DeliverTo" } ] }, "filters": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/QuoteRequestFilters" } ] }, "integrationAppId": { "type": [ "string", "null" ] }, "onBehalfOf": { "description": "The direct user a broker quotes for.", "type": [ "string", "null" ] }, "preferredWallets": { "additionalProperties": { "type": "string" }, "description": "Per CAIP-2 chain: a wallet the caller prefers to sell from, by target id or address. A\npreference, not a choice: a venue account uses it only where it is one of that account's\nlinked wallets on the venue's network, and otherwise quotes from its own default; a venue is\nnever refused because of it. `source.tradingWallets` is the explicit choice and wins on its chain.", "propertyNames": { "description": "A CAIP-2 chain id (`eip155:8453`, `solana:`, `tron:shasta`), syntax-checked:\na namespace of 3 to 8 lowercase letters, digits or `-`, and a reference of 1 to 32\nletters, digits, `-` or `_`. Compared exactly, as CAIP-2 references are case-sensitive.", "example": "eip155:8453", "type": "string" }, "type": [ "object", "null" ] }, "priceProtectionBps": { "description": "The bound between a non-firm executable quote and what execution delivers.", "format": "int32", "minimum": 0, "type": [ "integer", "null" ] }, "sell": { "$ref": "#/components/schemas/QuoteSideRequest", "description": "The Asset the taker sells, and optionally its chain." }, "sellAmount": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/DecimalAmount", "description": "The exact amount to sell, a positive decimal string in Asset units. Exactly one of\n`sellAmount` and `buyAmount` (400 `INVALID_REQUEST` naming both otherwise)." } ] }, "sort": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/QuoteSort", "description": "Default `netReceived`." } ] }, "source": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/SourceSelection" } ] }, "timeout": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/IsoDuration", "description": "Collection deadline, an ISO 8601 duration; default `PT6S`, at least 100 milliseconds and at\nmost `PT10S`." } ] } }, "required": [ "sell", "buy" ], "type": "object" }, "PairQuoteSet": { "description": "The JSON reply, and the SSE `complete` event.", "properties": { "quoteRequestId": { "description": "The quote set's id (`rq_…`), read back at `GET /quotes/requests/{quoteRequestId}`.\nThe HTTP request id is separate (`X-Request-Id`, an error body's `requestId`).", "type": "string" }, "quotes": { "items": { "$ref": "#/components/schemas/PairQuote" }, "type": "array" }, "referenceMid": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/ReferenceMid", "description": "The Reference mid this request's cards were priced against, read once per request.\nAbsent when the read failed or ran past its budget: the cards then read\n`noReferenceMid`, never a spread of 0." } ] }, "sourceOptions": { "description": "The trading wallets this caller may name in `source.tradingWallets`, per network:\neach one's stored financial account (`acct_…`), scoped to the principal (an API key\nsees only the organisation wallets granted to it). Sent even when no card was priced,\nso an unbound request learns what to bind. Empty when none is usable.", "items": { "$ref": "#/components/schemas/SourceOption" }, "type": "array" }, "sources": { "description": "Every considered venue, with its outcome.", "items": { "$ref": "#/components/schemas/QuoteSourceEntry" }, "type": "array" }, "venueAsked": { "description": "Whether answering this request contacted any venue (a live or firm ask), always\nsent; `false` when every quote came from cache.", "type": "boolean" } }, "required": [ "quoteRequestId", "quotes", "sourceOptions", "sources", "venueAsked" ], "type": "object" }, "PayBalance": { "description": "One chain's read of the sell Asset in the caller's Default-binding wallet.\n\nNew values may be added; treat unknown values as other.", "oneOf": [ { "properties": { "amount": { "$ref": "#/components/schemas/DecimalAmount" }, "chain": { "description": "CAIP-2 chain of the deployment read.", "type": "string" }, "observedAt": { "format": "date-time", "type": "string" }, "state": { "description": "New values may be added; treat unknown values as other.", "enum": [ "fresh" ], "type": "string", "x-extensible-enum": true } }, "required": [ "chain", "amount", "observedAt", "state" ], "type": "object" }, { "description": "No measured amount is usable: `cold` (the first read is in flight), `expired`,\n`failed`, `noRpc`, `noFetcher` or `unsupportedNative`.", "properties": { "chain": { "type": "string" }, "reason": { "type": "string" }, "state": { "description": "New values may be added; treat unknown values as other.", "enum": [ "unavailable" ], "type": "string", "x-extensible-enum": true } }, "required": [ "chain", "reason", "state" ], "type": "object" } ], "x-extensible-enum": true }, "PayBy": { "properties": { "clock": { "$ref": "#/components/schemas/FundingClock" }, "seconds": { "format": "int32", "minimum": 0, "type": "integer" } }, "required": [ "seconds", "clock" ], "type": "object" }, "PayInTerms": { "properties": { "afterPayBy": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/AfterPayBy_String" } ] }, "payBy": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/PayBy", "description": "`null` means the venue declares no deadline, not an inferred duration." } ] }, "settlementGrace": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/SettlementGrace" } ] } }, "type": "object" }, "PayoutRailReference": { "description": "New values may be added; treat unknown values as other.", "oneOf": [ { "properties": { "state": { "description": "New values may be added; treat unknown values as other.", "enum": [ "not_reported_yet" ], "type": "string", "x-extensible-enum": true } }, "required": [ "state" ], "type": "object" }, { "properties": { "kind": { "$ref": "#/components/schemas/PayoutRailReferenceKind" }, "state": { "description": "New values may be added; treat unknown values as other.", "enum": [ "reported" ], "type": "string", "x-extensible-enum": true }, "value": { "type": "string" } }, "required": [ "kind", "value", "state" ], "type": "object" } ], "x-extensible-enum": true }, "PayoutRailReferenceKind": { "description": "New values may be added; treat unknown values as other.", "enum": [ "swift_uetr", "sepa_end_to_end_id", "faster_payments_reference", "bank_rail_reference" ], "type": "string", "x-extensible-enum": true }, "PayoutRecipientConfirmation": { "properties": { "confirmationId": { "format": "uuid", "type": "string" }, "confirmedAt": { "format": "date-time", "type": "string" }, "confirmedBy": { "description": "`user:` or `key:`; immutable authenticated identity.", "type": "string" }, "confirmedByName": { "description": "A safe name captured at confirmation, never an email address.", "type": "string" }, "legId": { "format": "uuid", "type": "string" } }, "required": [ "confirmationId", "legId", "confirmedBy", "confirmedByName", "confirmedAt" ], "type": "object" }, "PermissionRequestTarget": { "description": "New values may be added; treat unknown values as other.", "oneOf": [ { "properties": { "kind": { "description": "New values may be added; treat unknown values as other.", "enum": [ "walletRight" ], "type": "string", "x-extensible-enum": true }, "right": { "$ref": "#/components/schemas/PermissionRequestWalletRight" }, "venueId": { "type": [ "string", "null" ] }, "walletId": { "format": "uuid", "type": "string" } }, "required": [ "walletId", "right", "kind" ], "type": "object" }, { "properties": { "kind": { "description": "New values may be added; treat unknown values as other.", "enum": [ "workspacePermission" ], "type": "string", "x-extensible-enum": true }, "permission": { "$ref": "#/components/schemas/WorkspacePermission" }, "venueId": { "type": [ "string", "null" ] } }, "required": [ "permission", "kind" ], "type": "object" } ], "x-extensible-enum": true }, "PermissionRequestWalletRight": { "description": "New values may be added; treat unknown values as other.", "enum": [ "trade", "transfer", "manageDestinations" ], "type": "string", "x-extensible-enum": true }, "PlatformStatus": { "description": "The workspace's platform status: onboarding, active, suspended or deactivated. lifecycle tells a KYB lapse apart from a suspension.\n\nNew values may be added; treat unknown values as other.", "enum": [ "onboarding", "active", "suspended", "deactivated" ], "type": "string", "x-extensible-enum": true }, "PolicyRunRef": { "description": "One on-chain ACE policy run observed for an order's transaction.", "properties": { "blockNumber": { "description": "The block this run landed in, when known.", "format": "int64", "minimum": 0, "type": [ "integer", "null" ] }, "blockTime": { "format": "date-time", "type": [ "string", "null" ] }, "chainId": { "format": "int64", "minimum": 0, "type": "integer" }, "enforced": { "description": "Whether the engine ENFORCED the policy (vs observe-only). Distinct\nfrom `gate`: this says whether the observation BLOCKED\nadmission, that says whether any policy ran at all.", "type": "boolean" }, "engineAddress": { "type": "string" }, "gate": { "$ref": "#/components/schemas/AcePolicyGate", "description": "Whether a policy actually evaluated this call: `enforced` (with the\nnumber of policies that ran), `open` (no policy, the default allowed it)\nor `unknown`." }, "selector": { "type": "string" }, "targetAddress": { "type": "string" }, "transactionHash": { "type": "string" } }, "required": [ "transactionHash", "chainId", "engineAddress", "targetAddress", "selector", "enforced", "gate" ], "type": "object" }, "PreflightActionActor": { "description": "New values may be added; treat unknown values as other.", "enum": [ "userWallet", "tetrafiApi" ], "type": "string", "x-extensible-enum": true }, "PreflightActionAfter": { "description": "New values may be added; treat unknown values as other.", "enum": [ "waitForTransactionMined", "rerunPreflight", "postOrder" ], "type": "string", "x-extensible-enum": true }, "PreflightActionFrequency": { "description": "New values may be added; treat unknown values as other.", "enum": [ "perTrade", "reusableSetup" ], "type": "string", "x-extensible-enum": true }, "PreflightActionPurpose": { "description": "New values may be added; treat unknown values as other.", "enum": [ "tokenApproval", "bridgeDeposit", "wrapNative", "programmableExecution", "orderSignature", "orderSubmit", "walletLink", "tradeLedgerAuthorization", "lpFunding" ], "type": "string", "x-extensible-enum": true }, "PreflightActionType": { "description": "New values may be added; treat unknown values as other.", "enum": [ "authorizeWallet", "evmTransaction", "chainTransaction", "signTypedData", "signMessage", "postOrder", "linkWallet", "fundLpAccount" ], "type": "string", "x-extensible-enum": true }, "PreflightChainTransactionV1": { "description": "A transaction for the client to sign and send, tagged by its chain namespace\nso EVM and non-EVM transactions each carry their own fields.\n\nNew values may be added; treat unknown values as other.", "oneOf": [ { "properties": { "data": { "type": "string" }, "kind": { "description": "New values may be added; treat unknown values as other.", "enum": [ "evm" ], "type": "string", "x-extensible-enum": true }, "to": { "type": "string" }, "value": { "type": "string" } }, "required": [ "to", "data", "value", "kind" ], "type": "object" }, { "properties": { "feePayer": { "type": "string" }, "kind": { "description": "New values may be added; treat unknown values as other.", "enum": [ "solana" ], "type": "string", "x-extensible-enum": true }, "lastValidBlockHeight": { "format": "int64", "minimum": 0, "type": "integer" }, "messageHash": { "type": "string" }, "recentBlockhash": { "type": "string" }, "requiredSigners": { "items": { "type": "string" }, "type": "array" }, "wireTransactionBase64": { "type": "string" } }, "required": [ "wireTransactionBase64", "messageHash", "recentBlockhash", "lastValidBlockHeight", "feePayer", "requiredSigners", "kind" ], "type": "object" } ], "x-extensible-enum": true }, "PreflightEvmTransaction": { "properties": { "data": { "type": "string" }, "to": { "type": "string" }, "value": { "type": "string" } }, "required": [ "to", "data", "value" ], "type": "object" }, "PreflightMessageEncoding": { "description": "Encoding of the exact bytes presented to a non-EVM wallet.\n\nNew values may be added; treat unknown values as other.", "enum": [ "base64" ], "type": "string", "x-extensible-enum": true }, "PreflightNextAction": { "properties": { "actor": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/PreflightActionActor" } ] }, "after": { "items": { "$ref": "#/components/schemas/PreflightActionAfter" }, "type": "array" }, "chain": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/ChainRefV1" } ] }, "chainId": { "format": "int64", "minimum": 0, "type": [ "integer", "null" ] }, "details": { "description": "Protocol wallet actions expose `effectiveFloor` as a decimal string in the\noutput asset's base units: the signed execution's minimum output. Preflight\nrefuses signing guidance when that bound cannot be read." }, "frequency": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/PreflightActionFrequency" } ] }, "purpose": { "$ref": "#/components/schemas/PreflightActionPurpose" }, "sourceAuthorizationMessage": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/PreflightSourceAuthorizationMessageV1", "description": "Exact byte message a non-EVM wallet must authorize. This is separate\nfrom `typedData` so clients never coerce an Ed25519 source permit into\nEIP-712 or sign an opaque value extracted from `details`." } ] }, "submitTo": { "type": [ "string", "null" ] }, "transaction": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/PreflightChainTransactionV1" } ] }, "tx": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/PreflightEvmTransaction" } ] }, "type": { "$ref": "#/components/schemas/PreflightActionType" }, "typedData": {}, "walletAuthorization": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/WalletSigningPreparation", "description": "Owner-factor preparation for the explicitly selected signing wallet.\nThis does not authorize signing or imply a reusable delegation grant." } ] } }, "required": [ "type", "purpose" ], "type": "object" }, "PreflightSourceAuthorizationMessageV1": { "description": "Exact source-permit message a wallet signs before an API relayer submits\nthe corresponding source transaction.", "properties": { "deadline": { "format": "int64", "minimum": 0, "type": "integer" }, "encoding": { "$ref": "#/components/schemas/PreflightMessageEncoding" }, "message": { "description": "Canonical base64 bytes returned by the versioned protocol builder.", "type": "string" }, "nonce": { "description": "Canonical unsigned u64 decimal string. JSON numbers cannot preserve the\nfull replay-nonce domain in JavaScript clients.", "type": "string" }, "scheme": { "$ref": "#/components/schemas/PreflightSourceAuthorizationScheme" }, "signer": { "description": "Case-sensitive base58 wallet expected to sign the message.", "type": "string" } }, "required": [ "scheme", "encoding", "message", "signer", "nonce", "deadline" ], "type": "object" }, "PreflightSourceAuthorizationScheme": { "description": "Scheme carried by a typed non-EVM source-authorization action.\n\nNew values may be added; treat unknown values as other.", "enum": [ "svmSourcePermit", "svmOrder" ], "type": "string", "x-extensible-enum": true }, "PriceRow": { "allOf": [ { "$ref": "#/components/schemas/PriceRowStatus" }, { "$ref": "#/components/schemas/CardFirmness", "description": "Written as `firm` and `lastLook`, both always false: a price binds no venue. Uses the\ncard's one firmness writer, so a row and a card never disagree on the shape." }, { "properties": { "basis": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/QuoteBasis", "description": "`levels` or `model`; `null` when the row holds no price." } ] }, "blockNumber": { "format": "int64", "minimum": 0, "type": [ "integer", "null" ] }, "buyVariant": { "$ref": "#/components/schemas/AssetVariant" }, "ladderSemantics": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/LadderSemantics", "description": "`incremental` whenever `levels` is present." } ] }, "levels": { "description": "The venue's own levels, normalized to incremental, in sell units.", "items": { "$ref": "#/components/schemas/PricesLadderLevel" }, "type": [ "array", "null" ] }, "location": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/LegLocation", "description": "Where the price executes; `null` on a row with no cached corridor (a venue that\nholds nothing for the pair)." } ] }, "observedAt": { "format": "date-time", "type": [ "string", "null" ] }, "sellVariant": { "$ref": "#/components/schemas/AssetVariant" }, "sizes": { "description": "One entry per requested size, in request order; empty when the row holds no price.", "items": { "$ref": "#/components/schemas/PriceSize" }, "type": "array" }, "spreadFromMidBps": { "$ref": "#/components/schemas/SpreadFromMid", "description": "At the first size, against the Reference mid; `unavailable` when the mid cannot be\nread, never 0." }, "staleAfter": { "format": "date-time", "type": [ "string", "null" ] }, "venue": { "$ref": "#/components/schemas/QuoteVenue" } }, "required": [ "venue", "location", "sellVariant", "buyVariant", "basis", "observedAt", "staleAfter", "blockNumber", "sizes", "levels", "ladderSemantics", "spreadFromMidBps" ], "type": "object" } ], "description": "One venue's price for one location and variant pair." }, "PriceRowStatus": { "description": "A row's outcome:\n\n| status | meaning |\n|---|---|\n| `priced` | a fresh cached price |\n| `stale` | past `staleAfter`, or a private source still warming; any price kept |\n| `unsupported` | `pairNotServed`: the venue holds nothing for the pair; `priceSourceNone`: it publishes no price (asked only on `POST /quotes`); `buyAmountUnsupported` |\n| `belowMin` | the first size is under the source's minimum |\n| `insufficientDepth` | the source cannot fill the first size |\n| `needsWallet` | the venue prices only for a wallet |\n| `restricted` | a gate keeps the desk price from this principal |\n| `unavailable` | a read failed, or a fee could not be computed; `notYetPublished`: the venue publishes this pair and nothing is cached for it yet |\n\nNew values may be added; treat unknown values as other.", "oneOf": [ { "properties": { "status": { "description": "New values may be added; treat unknown values as other.", "enum": [ "priced" ], "type": "string", "x-extensible-enum": true } }, "required": [ "status" ], "type": "object" }, { "properties": { "status": { "description": "New values may be added; treat unknown values as other.", "enum": [ "stale" ], "type": "string", "x-extensible-enum": true } }, "required": [ "status" ], "type": "object" }, { "properties": { "reason": { "description": "Known source reason tokens (not all apply to every status): `adapterPayloadSerializationFailed`, `basicVenueAccountsUnavailable`, `billingPaymentOverdue`, `walletNotOnChain`, `ccxtVenueRequiresCexLane`, `executionStageDisabled`, `jurisdictionUnproven`, `onboardedVenuesUnavailable`, `onchainAccountDefaultWalletRequired`, `onchainAccountDefaultWalletUnavailable`, `onchainAccountWalletRequired`, `onchainAssetDecimalsMismatch`, `onchainAssetIdentityMismatch`, `onchainAssetUnmapped`, `onchainAssetVariantFiltered`, `onchainWalletUnavailable`, `onchainCatalogueUnavailable`, `onchainDeliverToNotReceivingWallet`, `onchainDeliverToUnverified`, `onchainMarketsUnavailable`, `onchainMarketCatalogUnreadable`, `onchainMarketChainRequired`, `onchainMarketVariantRequired`, `onchainMarketTokenRequired`, `onchainSiteChainUnreadable`, `onchainWalletChainUnreadable`, `onchainWalletInactive`, `onchainWalletNotLinked`, `onchainWalletNotUsable`, `onchainWalletPickAmbiguous`, `onchainWalletWrongNetwork`, `signerLacksRight`, `signerUnavailable`, `signingGrantAmbiguous`, `signingGrantExpired`, `signingGrantRequired`, `signingGrantTokenNotKept`, `signingGrantTokenNotPayable`, `solverChainUnready`, `walletChainMismatch`, `walletNotUsableByYou`, `walletNotVerifiedForAce`, `walletNotWhitelisted`, `withdrawalChainUnsupported`, `accountFeeUnavailable`, `comparisonCostsUnavailable`, `connectionListingUnavailable`, `feeUnverified`, `noPool`, `noPrice`, `noSize`, `notFilled`, `notYetPublished`, `priceArithmetic`, `priceSourceNone`, `referenceMidUnavailable`, `settlementPrecisionUnavailable`, `accountSetupIncomplete`, `admissionUnavailable`, `advancedAccountEligibilityUnavailable`, `advancedAccountStateInconsistent`, `advancedConnectionDisabled`, `advancedConnectionNotConfigured`, `advancedConnectionPaused`, `advancedSettlementNeedsVerification`, `advancedModeDisabled`, `advancedNotAvailableForAccount`, `advancedNotEnabledForAccount`, `allowanceUnavailable`, `acrossCapacityExceeded`, `relayCapacityExceeded`, `acrossChainNotCarried`, `cctpChainNotCarried`, `relayChainNotCarried`, `apiKeyAdvancedWalletUnsupported`, `apiKeyOrganisationWalletScopeRequired`, `grantCapExceeded`, `amountAboveMaximum`, `amountBelowMinimum`, `amountUnreadable`, `amountsUnreadable`, `askFirst`, `authorityUnavailable`, `automationNeverAsks`, `availabilityUnreadable`, `backgroundNeverAsks`, `balanceUnreadable`, `defaultsUnavailable`, `walletHasNoAddress`, `walletUnavailable`, `bondAmountUnreadable`, `bondAssetUnreadable`, `catalogueUnavailable`, `chainFamilyUnknown`, `chainUnrecorded`, `clientSessionRequired`, `clockUnreadable`, `comingSoon`, `connectionChanged`, `connectionRevoked`, `corridorInvalid`, `credential`, `deadlineExceeded`, `defaultsLoading`, `deliverToCalldataUnsupported`, `deliverToTagUnsupported`, `deliverToNotPermitted`, `deliverToUnreadable`, `tradingPermissionRequired`, `directPatienceHarvest`, `economicallyInferior`, `exactAmountConflictsWithCard`, `exactAmountConflictsWithQuote`, `exactOutputDeliveryUnsupported`, `exactOutputEstimateUnavailable`, `exactRouteHypothesisUnavailable`, `expiredOnArrival`, `expiryUnknown`, `feeUnreadable`, `filteredOut`, `firmAskRefused`, `freshnessUnknown`, `fundingWindow`, `insufficientLiquidity`, `venueRelationship`, `venueRelationshipUnavailable`, `lpUnknown`, `mfaEnrolmentRequired`, `mfaRequired`, `minimumUnverified`, `mixedNetworks`, `netReceivedUnavailable`, `networkUnrecorded`, `noAddress`, `noCard`, `noFetcher`, `noInventory`, `noLaneForPair`, `noLegs`, `noOnChainCorridor`, `noPlannedVenue`, `noQuote`, `noRpc`, `notConnected`, `notEligible`, `notExecutable`, `orderPayloadMissing`, `outsideTopComposites`, `pairUnmapped`, `sellChainInvalid`, `permissionsUnreadable`, `placeOrderNotPermitted`, `prefundingMarkerUnreadable`, `prefundingRequired`, `indicative`, `priceOnRequest`, `priceOutOfRange`, `priceProtectionInvalid`, `pricingBookOnly`, `productNotQuoted`, `protocolChainMissing`, `providerFeeTreatmentUnknown`, `providerSiteUnrecorded`, `quoteIdUnissuable`, `quoteNotHeld`, `buyChainInvalid`, `buyAmountUnsupported`, `exactOutputDebitUnavailable`, `pairNotServed`, `receiveWalletNotServed`, `referenceMidUnreadable`, `referencePriceUnavailable`, `registryUnavailable`, `releaseRecheckUnavailable`, `requestUnbuildable`, `routeLegChainUnknown`, `routeLegUnnamed`, `routeLegUnplanned`, `routeUnavailable`, `secondFactorUnreadable`, `shortfallUnmeasured`, `shortfallUnreadable`, `singleChainVenue`, `siteChainUnreadable`, `sizeNotEligible`, `submitOrderBlocked`, `takerOnboardingIncomplete`, `tierNotQuoted`, `tradePaused`, `unsupportedNative`, `venueConnectionStorageUnavailable`, `venueDataStale`, `venueDeclined`, `venueNotConnected`, `venueNotEnabledForWorkspace`, `venueNotListed`, `venueTradeKeyUnavailable`, `venueTradeScopeRequired`, `venueTradeUnreadable`, `venueUnavailable`, `walletRefused`, `withdrawalFeeUnread`, `acrossRoutedViaCctp`, `apiKeyOrganisationWalletNotAllowlisted`, `balanceAvailabilityUnconfirmed`, `bankDestinationUnavailable`, `bebopJamKeyNotEnabled`, `bebopJamQuoteDeclined`, `bebopTokenUnavailable`, `relayCurrencyUnsupported`, `relaySwapImpactTooHigh`, `tetrafiSolverCallbackNotAuthorized`, `tradingLinkSnapshotChanged`, `tradingLinkSnapshotUnavailable`, `uniswapChainReadUnavailable`, `uniswapInsufficientDepth`, `uniswapQuoteUnreadable`, `uniswapUnwrapAboveDailyCap`, `uniswapUnwrapAboveTradeCap`, `uniswapRouteNotGranted`, `venueNotEnabled`, `askLimitReached`, `balanceMeaningUnconfirmed`, `bebopJamWalletUnsupported`, `bebopQuorumWalletTooSlow`, `bebopWalletQuorumUnreadable`, `connectionNotConfigured`, `deliveryAccountNetworkUnavailable`, `deliveryAccountUnavailable`, `destinationCannotSendOnChain`, `dexReferencePriceUnavailable`, `firmQuoteLimited`, `fundingAccountNetworkUnavailable`, `fundingAccountUnavailable`, `insufficientDepth`, `missingPermission`, `needsNativeGas`, `needsWallet`, `notPriced`, `payInTermsUnavailable`, `pilotTradeCapExceeded`, `platformFeeRateUnavailable`, `pricingBookPairUnserved`, `settlementDeclarationUnavailable`, `settlementNotAvailable`, `timedOut`, `timedOutBeforeSend`, `tradingSourceNetworkUnavailable`, `tradingSourceNotLinked`, `venueEnablementRechecking`, `venueEnablementUnavailable`, `venueListingTimedOut`, `venuePoliciesUnavailable`.\n\nNew values may be added; treat unknown values as other.", "type": "string" }, "status": { "description": "New values may be added; treat unknown values as other.", "enum": [ "unsupported" ], "type": "string", "x-extensible-enum": true } }, "required": [ "reason", "status" ], "type": "object" }, { "properties": { "status": { "description": "New values may be added; treat unknown values as other.", "enum": [ "belowMin" ], "type": "string", "x-extensible-enum": true } }, "required": [ "status" ], "type": "object" }, { "properties": { "status": { "description": "New values may be added; treat unknown values as other.", "enum": [ "insufficientDepth" ], "type": "string", "x-extensible-enum": true } }, "required": [ "status" ], "type": "object" }, { "properties": { "status": { "description": "New values may be added; treat unknown values as other.", "enum": [ "needsWallet" ], "type": "string", "x-extensible-enum": true } }, "required": [ "status" ], "type": "object" }, { "properties": { "reason": { "$ref": "#/components/schemas/RestrictedReason", "description": "Known source reason tokens (not all apply to every status): `adapterPayloadSerializationFailed`, `basicVenueAccountsUnavailable`, `billingPaymentOverdue`, `walletNotOnChain`, `ccxtVenueRequiresCexLane`, `executionStageDisabled`, `jurisdictionUnproven`, `onboardedVenuesUnavailable`, `onchainAccountDefaultWalletRequired`, `onchainAccountDefaultWalletUnavailable`, `onchainAccountWalletRequired`, `onchainAssetDecimalsMismatch`, `onchainAssetIdentityMismatch`, `onchainAssetUnmapped`, `onchainAssetVariantFiltered`, `onchainWalletUnavailable`, `onchainCatalogueUnavailable`, `onchainDeliverToNotReceivingWallet`, `onchainDeliverToUnverified`, `onchainMarketsUnavailable`, `onchainMarketCatalogUnreadable`, `onchainMarketChainRequired`, `onchainMarketVariantRequired`, `onchainMarketTokenRequired`, `onchainSiteChainUnreadable`, `onchainWalletChainUnreadable`, `onchainWalletInactive`, `onchainWalletNotLinked`, `onchainWalletNotUsable`, `onchainWalletPickAmbiguous`, `onchainWalletWrongNetwork`, `signerLacksRight`, `signerUnavailable`, `signingGrantAmbiguous`, `signingGrantExpired`, `signingGrantRequired`, `signingGrantTokenNotKept`, `signingGrantTokenNotPayable`, `solverChainUnready`, `walletChainMismatch`, `walletNotUsableByYou`, `walletNotVerifiedForAce`, `walletNotWhitelisted`, `withdrawalChainUnsupported`, `accountFeeUnavailable`, `comparisonCostsUnavailable`, `connectionListingUnavailable`, `feeUnverified`, `noPool`, `noPrice`, `noSize`, `notFilled`, `notYetPublished`, `priceArithmetic`, `priceSourceNone`, `referenceMidUnavailable`, `settlementPrecisionUnavailable`, `accountSetupIncomplete`, `admissionUnavailable`, `advancedAccountEligibilityUnavailable`, `advancedAccountStateInconsistent`, `advancedConnectionDisabled`, `advancedConnectionNotConfigured`, `advancedConnectionPaused`, `advancedSettlementNeedsVerification`, `advancedModeDisabled`, `advancedNotAvailableForAccount`, `advancedNotEnabledForAccount`, `allowanceUnavailable`, `acrossCapacityExceeded`, `relayCapacityExceeded`, `acrossChainNotCarried`, `cctpChainNotCarried`, `relayChainNotCarried`, `apiKeyAdvancedWalletUnsupported`, `apiKeyOrganisationWalletScopeRequired`, `grantCapExceeded`, `amountAboveMaximum`, `amountBelowMinimum`, `amountUnreadable`, `amountsUnreadable`, `askFirst`, `authorityUnavailable`, `automationNeverAsks`, `availabilityUnreadable`, `backgroundNeverAsks`, `balanceUnreadable`, `defaultsUnavailable`, `walletHasNoAddress`, `walletUnavailable`, `bondAmountUnreadable`, `bondAssetUnreadable`, `catalogueUnavailable`, `chainFamilyUnknown`, `chainUnrecorded`, `clientSessionRequired`, `clockUnreadable`, `comingSoon`, `connectionChanged`, `connectionRevoked`, `corridorInvalid`, `credential`, `deadlineExceeded`, `defaultsLoading`, `deliverToCalldataUnsupported`, `deliverToTagUnsupported`, `deliverToNotPermitted`, `deliverToUnreadable`, `tradingPermissionRequired`, `directPatienceHarvest`, `economicallyInferior`, `exactAmountConflictsWithCard`, `exactAmountConflictsWithQuote`, `exactOutputDeliveryUnsupported`, `exactOutputEstimateUnavailable`, `exactRouteHypothesisUnavailable`, `expiredOnArrival`, `expiryUnknown`, `feeUnreadable`, `filteredOut`, `firmAskRefused`, `freshnessUnknown`, `fundingWindow`, `insufficientLiquidity`, `venueRelationship`, `venueRelationshipUnavailable`, `lpUnknown`, `mfaEnrolmentRequired`, `mfaRequired`, `minimumUnverified`, `mixedNetworks`, `netReceivedUnavailable`, `networkUnrecorded`, `noAddress`, `noCard`, `noFetcher`, `noInventory`, `noLaneForPair`, `noLegs`, `noOnChainCorridor`, `noPlannedVenue`, `noQuote`, `noRpc`, `notConnected`, `notEligible`, `notExecutable`, `orderPayloadMissing`, `outsideTopComposites`, `pairUnmapped`, `sellChainInvalid`, `permissionsUnreadable`, `placeOrderNotPermitted`, `prefundingMarkerUnreadable`, `prefundingRequired`, `indicative`, `priceOnRequest`, `priceOutOfRange`, `priceProtectionInvalid`, `pricingBookOnly`, `productNotQuoted`, `protocolChainMissing`, `providerFeeTreatmentUnknown`, `providerSiteUnrecorded`, `quoteIdUnissuable`, `quoteNotHeld`, `buyChainInvalid`, `buyAmountUnsupported`, `exactOutputDebitUnavailable`, `pairNotServed`, `receiveWalletNotServed`, `referenceMidUnreadable`, `referencePriceUnavailable`, `registryUnavailable`, `releaseRecheckUnavailable`, `requestUnbuildable`, `routeLegChainUnknown`, `routeLegUnnamed`, `routeLegUnplanned`, `routeUnavailable`, `secondFactorUnreadable`, `shortfallUnmeasured`, `shortfallUnreadable`, `singleChainVenue`, `siteChainUnreadable`, `sizeNotEligible`, `submitOrderBlocked`, `takerOnboardingIncomplete`, `tierNotQuoted`, `tradePaused`, `unsupportedNative`, `venueConnectionStorageUnavailable`, `venueDataStale`, `venueDeclined`, `venueNotConnected`, `venueNotEnabledForWorkspace`, `venueNotListed`, `venueTradeKeyUnavailable`, `venueTradeScopeRequired`, `venueTradeUnreadable`, `venueUnavailable`, `walletRefused`, `withdrawalFeeUnread`, `acrossRoutedViaCctp`, `apiKeyOrganisationWalletNotAllowlisted`, `balanceAvailabilityUnconfirmed`, `bankDestinationUnavailable`, `bebopJamKeyNotEnabled`, `bebopJamQuoteDeclined`, `bebopTokenUnavailable`, `relayCurrencyUnsupported`, `relaySwapImpactTooHigh`, `tetrafiSolverCallbackNotAuthorized`, `tradingLinkSnapshotChanged`, `tradingLinkSnapshotUnavailable`, `uniswapChainReadUnavailable`, `uniswapInsufficientDepth`, `uniswapQuoteUnreadable`, `uniswapUnwrapAboveDailyCap`, `uniswapUnwrapAboveTradeCap`, `uniswapRouteNotGranted`, `venueNotEnabled`, `askLimitReached`, `balanceMeaningUnconfirmed`, `bebopJamWalletUnsupported`, `bebopQuorumWalletTooSlow`, `bebopWalletQuorumUnreadable`, `connectionNotConfigured`, `deliveryAccountNetworkUnavailable`, `deliveryAccountUnavailable`, `destinationCannotSendOnChain`, `dexReferencePriceUnavailable`, `firmQuoteLimited`, `fundingAccountNetworkUnavailable`, `fundingAccountUnavailable`, `insufficientDepth`, `missingPermission`, `needsNativeGas`, `needsWallet`, `notPriced`, `payInTermsUnavailable`, `pilotTradeCapExceeded`, `platformFeeRateUnavailable`, `pricingBookPairUnserved`, `settlementDeclarationUnavailable`, `settlementNotAvailable`, `timedOut`, `timedOutBeforeSend`, `tradingSourceNetworkUnavailable`, `tradingSourceNotLinked`, `venueEnablementRechecking`, `venueEnablementUnavailable`, `venueListingTimedOut`, `venuePoliciesUnavailable`.\n\nNew values may be added; treat unknown values as other." }, "status": { "description": "New values may be added; treat unknown values as other.", "enum": [ "restricted" ], "type": "string", "x-extensible-enum": true } }, "required": [ "reason", "status" ], "type": "object" }, { "properties": { "reason": { "description": "Known source reason tokens (not all apply to every status): `adapterPayloadSerializationFailed`, `basicVenueAccountsUnavailable`, `billingPaymentOverdue`, `walletNotOnChain`, `ccxtVenueRequiresCexLane`, `executionStageDisabled`, `jurisdictionUnproven`, `onboardedVenuesUnavailable`, `onchainAccountDefaultWalletRequired`, `onchainAccountDefaultWalletUnavailable`, `onchainAccountWalletRequired`, `onchainAssetDecimalsMismatch`, `onchainAssetIdentityMismatch`, `onchainAssetUnmapped`, `onchainAssetVariantFiltered`, `onchainWalletUnavailable`, `onchainCatalogueUnavailable`, `onchainDeliverToNotReceivingWallet`, `onchainDeliverToUnverified`, `onchainMarketsUnavailable`, `onchainMarketCatalogUnreadable`, `onchainMarketChainRequired`, `onchainMarketVariantRequired`, `onchainMarketTokenRequired`, `onchainSiteChainUnreadable`, `onchainWalletChainUnreadable`, `onchainWalletInactive`, `onchainWalletNotLinked`, `onchainWalletNotUsable`, `onchainWalletPickAmbiguous`, `onchainWalletWrongNetwork`, `signerLacksRight`, `signerUnavailable`, `signingGrantAmbiguous`, `signingGrantExpired`, `signingGrantRequired`, `signingGrantTokenNotKept`, `signingGrantTokenNotPayable`, `solverChainUnready`, `walletChainMismatch`, `walletNotUsableByYou`, `walletNotVerifiedForAce`, `walletNotWhitelisted`, `withdrawalChainUnsupported`, `accountFeeUnavailable`, `comparisonCostsUnavailable`, `connectionListingUnavailable`, `feeUnverified`, `noPool`, `noPrice`, `noSize`, `notFilled`, `notYetPublished`, `priceArithmetic`, `priceSourceNone`, `referenceMidUnavailable`, `settlementPrecisionUnavailable`, `accountSetupIncomplete`, `admissionUnavailable`, `advancedAccountEligibilityUnavailable`, `advancedAccountStateInconsistent`, `advancedConnectionDisabled`, `advancedConnectionNotConfigured`, `advancedConnectionPaused`, `advancedSettlementNeedsVerification`, `advancedModeDisabled`, `advancedNotAvailableForAccount`, `advancedNotEnabledForAccount`, `allowanceUnavailable`, `acrossCapacityExceeded`, `relayCapacityExceeded`, `acrossChainNotCarried`, `cctpChainNotCarried`, `relayChainNotCarried`, `apiKeyAdvancedWalletUnsupported`, `apiKeyOrganisationWalletScopeRequired`, `grantCapExceeded`, `amountAboveMaximum`, `amountBelowMinimum`, `amountUnreadable`, `amountsUnreadable`, `askFirst`, `authorityUnavailable`, `automationNeverAsks`, `availabilityUnreadable`, `backgroundNeverAsks`, `balanceUnreadable`, `defaultsUnavailable`, `walletHasNoAddress`, `walletUnavailable`, `bondAmountUnreadable`, `bondAssetUnreadable`, `catalogueUnavailable`, `chainFamilyUnknown`, `chainUnrecorded`, `clientSessionRequired`, `clockUnreadable`, `comingSoon`, `connectionChanged`, `connectionRevoked`, `corridorInvalid`, `credential`, `deadlineExceeded`, `defaultsLoading`, `deliverToCalldataUnsupported`, `deliverToTagUnsupported`, `deliverToNotPermitted`, `deliverToUnreadable`, `tradingPermissionRequired`, `directPatienceHarvest`, `economicallyInferior`, `exactAmountConflictsWithCard`, `exactAmountConflictsWithQuote`, `exactOutputDeliveryUnsupported`, `exactOutputEstimateUnavailable`, `exactRouteHypothesisUnavailable`, `expiredOnArrival`, `expiryUnknown`, `feeUnreadable`, `filteredOut`, `firmAskRefused`, `freshnessUnknown`, `fundingWindow`, `insufficientLiquidity`, `venueRelationship`, `venueRelationshipUnavailable`, `lpUnknown`, `mfaEnrolmentRequired`, `mfaRequired`, `minimumUnverified`, `mixedNetworks`, `netReceivedUnavailable`, `networkUnrecorded`, `noAddress`, `noCard`, `noFetcher`, `noInventory`, `noLaneForPair`, `noLegs`, `noOnChainCorridor`, `noPlannedVenue`, `noQuote`, `noRpc`, `notConnected`, `notEligible`, `notExecutable`, `orderPayloadMissing`, `outsideTopComposites`, `pairUnmapped`, `sellChainInvalid`, `permissionsUnreadable`, `placeOrderNotPermitted`, `prefundingMarkerUnreadable`, `prefundingRequired`, `indicative`, `priceOnRequest`, `priceOutOfRange`, `priceProtectionInvalid`, `pricingBookOnly`, `productNotQuoted`, `protocolChainMissing`, `providerFeeTreatmentUnknown`, `providerSiteUnrecorded`, `quoteIdUnissuable`, `quoteNotHeld`, `buyChainInvalid`, `buyAmountUnsupported`, `exactOutputDebitUnavailable`, `pairNotServed`, `receiveWalletNotServed`, `referenceMidUnreadable`, `referencePriceUnavailable`, `registryUnavailable`, `releaseRecheckUnavailable`, `requestUnbuildable`, `routeLegChainUnknown`, `routeLegUnnamed`, `routeLegUnplanned`, `routeUnavailable`, `secondFactorUnreadable`, `shortfallUnmeasured`, `shortfallUnreadable`, `singleChainVenue`, `siteChainUnreadable`, `sizeNotEligible`, `submitOrderBlocked`, `takerOnboardingIncomplete`, `tierNotQuoted`, `tradePaused`, `unsupportedNative`, `venueConnectionStorageUnavailable`, `venueDataStale`, `venueDeclined`, `venueNotConnected`, `venueNotEnabledForWorkspace`, `venueNotListed`, `venueTradeKeyUnavailable`, `venueTradeScopeRequired`, `venueTradeUnreadable`, `venueUnavailable`, `walletRefused`, `withdrawalFeeUnread`, `acrossRoutedViaCctp`, `apiKeyOrganisationWalletNotAllowlisted`, `balanceAvailabilityUnconfirmed`, `bankDestinationUnavailable`, `bebopJamKeyNotEnabled`, `bebopJamQuoteDeclined`, `bebopTokenUnavailable`, `relayCurrencyUnsupported`, `relaySwapImpactTooHigh`, `tetrafiSolverCallbackNotAuthorized`, `tradingLinkSnapshotChanged`, `tradingLinkSnapshotUnavailable`, `uniswapChainReadUnavailable`, `uniswapInsufficientDepth`, `uniswapQuoteUnreadable`, `uniswapUnwrapAboveDailyCap`, `uniswapUnwrapAboveTradeCap`, `uniswapRouteNotGranted`, `venueNotEnabled`, `askLimitReached`, `balanceMeaningUnconfirmed`, `bebopJamWalletUnsupported`, `bebopQuorumWalletTooSlow`, `bebopWalletQuorumUnreadable`, `connectionNotConfigured`, `deliveryAccountNetworkUnavailable`, `deliveryAccountUnavailable`, `destinationCannotSendOnChain`, `dexReferencePriceUnavailable`, `firmQuoteLimited`, `fundingAccountNetworkUnavailable`, `fundingAccountUnavailable`, `insufficientDepth`, `missingPermission`, `needsNativeGas`, `needsWallet`, `notPriced`, `payInTermsUnavailable`, `pilotTradeCapExceeded`, `platformFeeRateUnavailable`, `pricingBookPairUnserved`, `settlementDeclarationUnavailable`, `settlementNotAvailable`, `timedOut`, `timedOutBeforeSend`, `tradingSourceNetworkUnavailable`, `tradingSourceNotLinked`, `venueEnablementRechecking`, `venueEnablementUnavailable`, `venueListingTimedOut`, `venuePoliciesUnavailable`.\n\nNew values may be added; treat unknown values as other.", "type": "string" }, "status": { "description": "New values may be added; treat unknown values as other.", "enum": [ "unavailable" ], "type": "string", "x-extensible-enum": true } }, "required": [ "reason", "status" ], "type": "object" } ], "x-extensible-enum": true }, "PriceSize": { "description": "One requested size, with a quote's meanings: `buy` is what lands after every\n`included` fee taken in the buy Asset, `netReceived` is for comparison only.", "properties": { "buy": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/DecimalAmount", "description": "The buy amount: the request's on a `buyAmount` read; on a `sellAmount` read, what the sell\namount buys, `null` when nothing could be priced at this size, never `0`." } ] }, "feeObservedAt": { "description": "When the included account commission was observed; display only, not quote consent.", "format": "date-time", "type": [ "string", "null" ] }, "fees": { "items": { "$ref": "#/components/schemas/QuoteFee" }, "type": "array" }, "filled": { "$ref": "#/components/schemas/SizeFill" }, "netReceived": { "$ref": "#/components/schemas/NetReceived" }, "sell": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/DecimalAmount", "description": "The sell amount: the request's on a `sellAmount` read, rounded down to the source's\nprecision; on a `buyAmount` read, what the buy amount costs, `null` when nothing could be\npriced at this size, never `0`." } ] } }, "required": [ "sell", "buy", "netReceived", "filled", "fees" ], "type": "object" }, "PricesLadderLevel": { "description": "One incremental level: `size` more sell units, each buying `price` buy units.", "properties": { "price": { "$ref": "#/components/schemas/DecimalAmount" }, "size": { "$ref": "#/components/schemas/DecimalAmount" } }, "required": [ "size", "price" ], "type": "object" }, "PricesResponse": { "description": "`GET /prices` 200, and each `snapshot` event of `GET /prices/stream`.", "properties": { "buy": { "$ref": "#/components/schemas/AssetId" }, "computedAt": { "description": "When the server built this snapshot (it reuses one for about a second).", "format": "date-time", "type": "string" }, "referenceMid": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/ReferenceMid", "description": "The pair's indicative reference mid, from the same source as POST /quotes. null only when the read failed, with the cause in referenceMidUnavailable; never zero, stale or guessed. Never a quote input." } ] }, "referenceMidUnavailable": { "description": "Why `referenceMid` is `null`: `marketDataUnavailable` (a market-data refusal or outage),\n`notPriced` (no reference price exists for an asset) or `timedOut` (past the read's budget).", "type": [ "string", "null" ] }, "rows": { "description": "Sorted like quotes: `netReceived` at the first size descending, an unavailable value\nlast, then by venue id (there is no `best`).", "items": { "$ref": "#/components/schemas/PriceRow" }, "type": "array" }, "sell": { "$ref": "#/components/schemas/AssetId" }, "sellBalances": { "description": "The sell Asset in the caller's own Default-binding wallets, one memory-only read\nper deployment (only the pinned chain when `sell.chain` is set). Display only, never a\nquote input. Empty for an API key, before the first warm, or with no bound wallet:\nunknown, never zero. A client totals the `fresh` entries and names every other entry\nas not read, never a silent partial total.", "items": { "$ref": "#/components/schemas/PayBalance" }, "type": "array" } }, "required": [ "sell", "buy", "computedAt", "rows", "sellBalances", "referenceMid" ], "type": "object" }, "ProtocolAdminMeResponse": { "properties": { "adminWorkspaceId": { "type": [ "string", "null" ] }, "enabled": { "type": "boolean" }, "granted": { "type": [ "boolean", "null" ] }, "scopes": { "items": { "type": "string" }, "type": "array" } }, "required": [ "enabled", "scopes" ], "type": "object" }, "ProtocolEnvironment": { "description": "The environment of the registry chain(s) a protocol leg executes on.\n\nNew values may be added; treat unknown values as other.", "oneOf": [ { "properties": { "network": { "description": "New values may be added; treat unknown values as other.", "enum": [ "testnet" ], "type": "string", "x-extensible-enum": true } }, "required": [ "network" ], "type": "object" }, { "properties": { "network": { "description": "New values may be added; treat unknown values as other.", "enum": [ "mainnet" ], "type": "string", "x-extensible-enum": true } }, "required": [ "network" ], "type": "object" }, { "properties": { "network": { "description": "New values may be added; treat unknown values as other.", "enum": [ "unavailable" ], "type": "string", "x-extensible-enum": true }, "reason": { "type": "string" } }, "required": [ "reason", "network" ], "type": "object" } ], "x-extensible-enum": true }, "ProviderProduct": { "description": "Executable product surface behind a provider capability.", "oneOf": [ { "description": "New values may be added; treat unknown values as other.", "enum": [ "stableRfq" ], "type": "string", "x-extensible-enum": true }, { "description": "New values may be added; treat unknown values as other.", "enum": [ "internalTreasury" ], "type": "string", "x-extensible-enum": true }, { "description": "New values may be added; treat unknown values as other.", "enum": [ "circleCpnPayout" ], "type": "string", "x-extensible-enum": true }, { "description": "New values may be added; treat unknown values as other.", "enum": [ "circleMintDeposit" ], "type": "string", "x-extensible-enum": true }, { "description": "New values may be added; treat unknown values as other.", "enum": [ "circleMintWithdrawal" ], "type": "string", "x-extensible-enum": true }, { "description": "New values may be added; treat unknown values as other.", "enum": [ "circleMintExchange" ], "type": "string", "x-extensible-enum": true }, { "description": "Registered on-chain primary-market mint/redeem capability.\n\nNew values may be added; treat unknown values as other.", "enum": [ "issuerPrimaryMarket" ], "type": "string", "x-extensible-enum": true }, { "description": "Circle CCTP burn-and-mint bridge corridor (route legs).\n\nNew values may be added; treat unknown values as other.", "enum": [ "cctpBridge" ], "type": "string", "x-extensible-enum": true }, { "description": "Across V4 liquidity relay bridge corridor (route legs).\n\nNew values may be added; treat unknown values as other.", "enum": [ "acrossBridge" ], "type": "string", "x-extensible-enum": true }, { "description": "Relay (relay.link) intents bridge corridor (route legs).\n\nNew values may be added; treat unknown values as other.", "enum": [ "relayBridge" ], "type": "string", "x-extensible-enum": true }, { "description": "Circle StableFX on-chain FX venue on Arc (`FxEscrow` settlement).\n\nNew values may be added; treat unknown values as other.", "enum": [ "arcStableFx" ], "type": "string", "x-extensible-enum": true }, { "description": "Direct same-chain swap through the registry-pinned DEX capability.\n\nNew values may be added; treat unknown values as other.", "enum": [ "dexSwap" ], "type": "string", "x-extensible-enum": true }, { "description": "Same-chain, firm-quoted RFQ swap settled through an approved kind-1 SwapModule. The quote is\nfirm for the venue's own TTL and the executable calldata is fetched at execution, never at\nquote time. Octarine is the first backing venue; the product is venue-neutral.\n\nNew values may be added; treat unknown values as other.", "enum": [ "rfqSwap" ], "type": "string", "x-extensible-enum": true }, { "description": "Cross-chain intent filled by a solver under OIF escrow settlement.\n\nNew values may be added; treat unknown values as other.", "enum": [ "oifIntent" ], "type": "string", "x-extensible-enum": true }, { "description": "A provider fiat ramp: bank money in or out at a fiat venue.\n\n`venue_id` names the instrument's venue: an order-book venue whose fiat pairs are\ninstruments of that venue (VALR's, Luno's), or a dedicated fiat venue (Lumx's). The\ndirection says which way bank money moves. Wire form (externally tagged):\n`{\"fiatVenue\":{\"venueId\":\"valr-orderbook\",\"direction\":\"payout\"}}`.", "properties": { "fiatVenue": { "description": "A provider fiat ramp: bank money in or out at a fiat venue.\n\n`venue_id` names the instrument's venue: an order-book venue whose fiat pairs are\ninstruments of that venue (VALR's, Luno's), or a dedicated fiat venue (Lumx's). The\ndirection says which way bank money moves. Wire form (externally tagged):\n`{\"fiatVenue\":{\"venueId\":\"valr-orderbook\",\"direction\":\"payout\"}}`.", "properties": { "direction": { "$ref": "#/components/schemas/FiatDirection" }, "venueId": { "type": "string" } }, "required": [ "venueId", "direction" ], "type": "object" } }, "required": [ "fiatVenue" ], "type": "object" }, { "description": "The venue route's first leg: the taker's funds leave their wallet and are credited to the route's balance at the venue. Final once forwarded.\n\nNew values may be added; treat unknown values as other.", "enum": [ "cexDeposit" ], "type": "string", "x-extensible-enum": true }, { "description": "The CEX lane's trade: a kind-10 `ACTION` hop on the hub router reserves a\n`TradeIntent` against the route's venue balance; the enclave fills or cancels it.\n\nNew values may be added; treat unknown values as other.", "enum": [ "cexTrade" ], "type": "string", "x-extensible-enum": true }, { "description": "The CEX lane's last leg: the route-relative payout leaf (kind-10 `ROUTE_PAYOUT`),\npre-signed by the route root, withdraws the route's balance to its recipient.\n\nNew values may be added; treat unknown values as other.", "enum": [ "cexPayout" ], "type": "string", "x-extensible-enum": true }, { "description": "Taker-signed WETH9 deposit of native payout proceeds, on the payout chain.\n\nNew values may be added; treat unknown values as other.", "enum": [ "wrapNative" ], "type": "string", "x-extensible-enum": true }, { "description": "A movement of the requesting workspace's own money at its LP account on a venue:\na trade on the venue's book, a withdrawal from the account to a chain\naddress, or a deposit into it. Wire form:\n`{\"workspaceVenue\":{\"venueId\":\"valr-orderbook\",\"movement\":\"trade\"}}`.", "properties": { "workspaceVenue": { "description": "A movement of the requesting workspace's own money at its LP account on a venue:\na trade on the venue's book, a withdrawal from the account to a chain\naddress, or a deposit into it. Wire form:\n`{\"workspaceVenue\":{\"venueId\":\"valr-orderbook\",\"movement\":\"trade\"}}`.", "properties": { "movement": { "$ref": "#/components/schemas/WorkspaceVenueMovement" }, "venueId": { "type": "string" } }, "required": [ "venueId", "movement" ], "type": "object" } }, "required": [ "workspaceVenue" ], "type": "object" } ] }, "PublicOrderStatus": { "description": "Open public lifecycle vocabulary shared by both order kinds. States may be\nskipped; act on `terminal`, not on a particular sequence.\n\nNew values may be added; treat unknown values as other.", "enum": [ "pending", "working", "filled", "settled", "unfilled", "cancelled", "failed", "refunded", "reviewRequired", "outcomeUnknown", "refused" ], "type": "string", "x-extensible-enum": true }, "QuoteAssurance": { "description": "Collateral backing a quote, separate from its firmness.", "properties": { "amount": { "$ref": "#/components/schemas/DecimalAmount" }, "asset": { "$ref": "#/components/schemas/AssetId" }, "bonded": { "type": "boolean" } }, "required": [ "amount", "asset", "bonded" ], "type": "object" }, "QuoteBasis": { "description": "Where the price came from.\n\nNew values may be added; treat unknown values as other.", "enum": [ "liveQuote", "levels", "model" ], "type": "string", "x-extensible-enum": true }, "QuoteCorridor": { "additionalProperties": false, "description": "A cross-chain route's source and destination chains.", "properties": { "from": { "$ref": "#/components/schemas/Caip2Chain" }, "to": { "$ref": "#/components/schemas/Caip2Chain" } }, "required": [ "from", "to" ], "type": "object" }, "QuoteFailureHandling": { "description": "What happens to the input when execution fails, a fact the quote reports.\n\nNew values may be added; treat unknown values as other.", "enum": [ "refundOnSource", "refundClaim", "needsNewSignature" ], "type": "string", "x-extensible-enum": true }, "QuoteFee": { "description": "One fee line. The same type serves `GET /prices` rows.", "properties": { "amount": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/DecimalAmount", "description": "`null` when the amount could not be read (a failed gas read), never `0`;\nsuch a quote's `netReceived` and `readiness` are `unavailable`." } ] }, "asset": { "$ref": "#/components/schemas/AssetId" }, "bound": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/QuoteFeeBound", "description": "The amount is an authorised ceiling, not an expected or charged fee." } ] }, "chain": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/Caip2Chain", "description": "The chain a `network` line's gas is spent on; `null` for a line that is\nnot bound to one chain." } ] }, "included": { "description": "Already taken: from `buy.amount` when in the receive Asset, else from `pay`.", "type": "boolean" }, "kind": { "$ref": "#/components/schemas/FeeLineKind" }, "leg": { "description": "The index of the leg it belongs to, or `null` for a quote-level line.", "format": "int32", "minimum": 0, "type": [ "integer", "null" ] }, "paidBy": { "$ref": "#/components/schemas/FeePayer" } }, "required": [ "amount", "asset", "chain", "included", "kind", "leg", "paidBy" ], "type": "object" }, "QuoteFeeBound": { "description": "New values may be added; treat unknown values as other.", "enum": [ "maximum" ], "type": "string", "x-extensible-enum": true }, "QuoteFixExistingRequest": { "description": "A pending permission request the caller already made for a `requestPermission` target.", "properties": { "createdAt": { "format": "date-time", "type": "string" }, "id": { "format": "uuid", "type": "string" } }, "required": [ "id", "createdAt" ], "type": "object" }, "QuoteFixFundingTarget": { "description": "A shortfall names either its paying wallet or its venue account's venue. A venue target\nnames the venue account and the route that reads its deposit instructions when the source\nknows that account.", "oneOf": [ { "properties": { "walletId": { "type": "string" } }, "required": [ "walletId" ], "type": "object" }, { "properties": { "action": { "description": "`GET` route for the venue account's deposit instructions.", "type": [ "string", "null" ] }, "venueAccountId": { "format": "uuid", "type": [ "string", "null" ] }, "venueId": { "type": "string" } }, "required": [ "venueId" ], "type": "object" } ] }, "QuoteFixVenueTarget": { "properties": { "venueId": { "type": "string" } }, "required": [ "venueId" ], "type": "object" }, "QuoteLeg": { "description": "One leg of a quote: the venue it runs on and where it executes.", "properties": { "execution": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/VenueExecution", "description": "A venue account's recorded execution facts; null on protocol legs." } ] }, "expectedArrival": { "description": "Bank-rail legs: an ISO 8601 UTC instant; `null` elsewhere.", "format": "date-time", "type": [ "string", "null" ] }, "fundingModel": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/FundingModel", "description": "Off-chain legs; `null` on-chain." } ] }, "location": { "$ref": "#/components/schemas/LegLocation" }, "network": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/ProtocolEnvironment", "description": "Protocol chain environment from the registry; additive so older clients can ignore it." } ] }, "product": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/ProviderProduct", "description": "The protocol product this leg runs (`cctp`, `acrossBridge`, …), from the served route;\nabsent on a venue-account leg or when the route does not name it. Never parsed out of\n`venue.name`, which is display text." } ] }, "relayMode": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/BridgeRelayMode", "description": "Who delivers a CCTP leg on the destination, and so whom its included network fee pays:\nCircle's Forwarding Service, or the TetraFi relayer on a clone-native leg (rfq 615dd36a2).\nAbsent on every other leg, and on a bridge quote that does not record it." } ] }, "transferMode": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/BridgeTransferMode", "description": "A bridge leg's transfer mode (`fast` or `standard`, e.g. CCTP Fast vs Standard); absent\non every other leg." } ] }, "venue": { "$ref": "#/components/schemas/QuoteVenue" } }, "required": [ "execution", "expectedArrival", "fundingModel", "location", "venue" ], "type": "object" }, "QuoteLiveState": { "description": "A point-in-time hold, not a grant of order or funding authority. Preflight/order\nre-check the original owner, binding and funding authority before dispatch.\n\nNew values may be added; treat unknown values as other.", "oneOf": [ { "properties": { "executable": { "type": "boolean" }, "expiresAt": { "format": "date-time", "type": "string" }, "state": { "description": "New values may be added; treat unknown values as other.", "enum": [ "held" ], "type": "string", "x-extensible-enum": true } }, "required": [ "executable", "expiresAt", "state" ], "type": "object" }, { "properties": { "expiresAt": { "format": "date-time", "type": "string" }, "state": { "description": "New values may be added; treat unknown values as other.", "enum": [ "expired" ], "type": "string", "x-extensible-enum": true } }, "required": [ "expiresAt", "state" ], "type": "object" }, { "properties": { "reason": { "type": "string" }, "state": { "description": "New values may be added; treat unknown values as other.", "enum": [ "notHeld" ], "type": "string", "x-extensible-enum": true } }, "required": [ "reason", "state" ], "type": "object" } ], "x-extensible-enum": true }, "QuoteLocation": { "description": "A quote's own location, an object so `.location.kind` reads the same on quotes, legs\nand rows: its legs' kind, or `mixed` when they differ.\n\nNew values may be added; treat unknown values as other.", "discriminator": { "propertyName": "kind" }, "oneOf": [ { "properties": { "kind": { "description": "New values may be added; treat unknown values as other.", "enum": [ "singleChain" ], "type": "string", "x-extensible-enum": true } }, "required": [ "kind" ], "type": "object" }, { "properties": { "kind": { "description": "New values may be added; treat unknown values as other.", "enum": [ "crossChain" ], "type": "string", "x-extensible-enum": true } }, "required": [ "kind" ], "type": "object" }, { "properties": { "kind": { "description": "New values may be added; treat unknown values as other.", "enum": [ "offChain" ], "type": "string", "x-extensible-enum": true } }, "required": [ "kind" ], "type": "object" }, { "properties": { "kind": { "description": "New values may be added; treat unknown values as other.", "enum": [ "mixed" ], "type": "string", "x-extensible-enum": true } }, "required": [ "kind" ], "type": "object" } ], "x-extensible-enum": true }, "QuoteNextAction": { "description": "The one action the caller takes next; later legs run\nunder the order.\n\nNew values may be added; treat unknown values as other.", "discriminator": { "propertyName": "kind" }, "oneOf": [ { "description": "`POST /orders {quoteId}`.", "properties": { "kind": { "description": "New values may be added; treat unknown values as other.", "enum": [ "order" ], "type": "string", "x-extensible-enum": true } }, "required": [ "kind" ], "type": "object" }, { "description": "`POST /orders/preflight`: the held terms may need an approval, allowance or\nreceipt the server cannot confirm from memory. Its response carries the next step.", "properties": { "kind": { "description": "New values may be added; treat unknown values as other.", "enum": [ "preflight" ], "type": "string", "x-extensible-enum": true } }, "required": [ "kind" ], "type": "object" }, { "description": "Send these transactions, then order.", "properties": { "kind": { "description": "New values may be added; treat unknown values as other.", "enum": [ "transact" ], "type": "string", "x-extensible-enum": true }, "transactions": { "items": { "$ref": "#/components/schemas/TakerTransaction" }, "type": "array" } }, "required": [ "transactions", "kind" ], "type": "object" }, { "description": "Sign this EIP-712 document, then order.", "properties": { "kind": { "description": "New values may be added; treat unknown values as other.", "enum": [ "sign" ], "type": "string", "x-extensible-enum": true }, "typedData": {} }, "required": [ "typedData", "kind" ], "type": "object" }, { "description": "Fund, then requote. `null` instructions when they could not be read; no order is\naccepted while short either way.", "properties": { "instructions": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/FundInstructions" } ] }, "kind": { "description": "New values may be added; treat unknown values as other.", "enum": [ "fund" ], "type": "string", "x-extensible-enum": true } }, "required": [ "kind" ], "type": "object" }, { "description": "Ask the venue again, with these Binding slots filled.", "properties": { "kind": { "description": "New values may be added; treat unknown values as other.", "enum": [ "requote" ], "type": "string", "x-extensible-enum": true }, "needs": { "items": { "$ref": "#/components/schemas/RequoteNeed" }, "type": "array" } }, "required": [ "needs", "kind" ], "type": "object" }, { "description": "Search again: `POST /quotes` with a pair body. The quote is past its requote window,\nso `{requote: quoteId}` can no longer refresh it.", "properties": { "kind": { "description": "New values may be added; treat unknown values as other.", "enum": [ "search" ], "type": "string", "x-extensible-enum": true } }, "required": [ "kind" ], "type": "object" }, { "description": "The venue outcome is being reconciled. Read this same order again after\nthe given ISO 8601 duration; never submit a replacement order.", "properties": { "kind": { "description": "New values may be added; treat unknown values as other.", "enum": [ "wait" ], "type": "string", "x-extensible-enum": true }, "retryAfter": { "$ref": "#/components/schemas/IsoDuration" } }, "required": [ "retryAfter", "kind" ], "type": "object" }, { "description": "Contact support with this non-secret order reference.", "properties": { "kind": { "description": "New values may be added; treat unknown values as other.", "enum": [ "contact" ], "type": "string", "x-extensible-enum": true }, "reference": { "type": "string" } }, "required": [ "reference", "kind" ], "type": "object" } ], "x-extensible-enum": true }, "QuoteOrderAddress": { "description": "The native order address for a held quote. Its owner supplies current state.\n\nNew values may be added; treat unknown values as other.", "oneOf": [ { "properties": { "kind": { "description": "New values may be added; treat unknown values as other.", "enum": [ "advancedTrade" ], "type": "string", "x-extensible-enum": true }, "orderId": { "type": "string" } }, "required": [ "orderId", "kind" ], "type": "object" }, { "properties": { "connectionId": { "format": "uuid", "type": "string" }, "kind": { "description": "New values may be added; treat unknown values as other.", "enum": [ "basicTrade" ], "type": "string", "x-extensible-enum": true }, "operationId": { "format": "uuid", "type": "string" } }, "required": [ "connectionId", "operationId", "kind" ], "type": "object" } ], "x-extensible-enum": true }, "QuoteOrderApprovalProgress": { "properties": { "explorerUrl": { "type": [ "string", "null" ] }, "phase": { "type": "string" }, "sellSymbol": { "type": "string" }, "txHash": { "type": [ "string", "null" ] } }, "required": [ "phase", "sellSymbol" ], "type": "object" }, "QuoteOrderOwnerAuthorization": { "additionalProperties": false, "description": "The owner factor for an embedded pay wallet's order signature. Never names a wallet or a\nsigning source: both come from the held binding.", "properties": { "authorizationId": { "description": "The completed hosted approval preflight prepared for this order.", "type": [ "string", "null" ] }, "authorizationSignature": { "description": "An operation-bound RPC owner factor, for a provider without hosted approval.", "type": [ "string", "null" ], "writeOnly": true }, "providerBody": { "description": "The exact native bytes the inline factor signed, when its provider needs them.", "type": [ "string", "null" ] }, "requestExpiryMs": { "description": "The provider request expiry the inline factor signed (Privy).", "format": "int64", "type": [ "integer", "null" ] } }, "type": "object" }, "QuoteOrderRecovery": { "description": "A read never dispatches. An unresolved claim is unknown, not proof of no order.\n\nNew values may be added; treat unknown values as other.", "oneOf": [ { "properties": { "order": { "$ref": "#/components/schemas/QuoteOrderAddress" }, "orderId": { "type": "string" }, "state": { "description": "New values may be added; treat unknown values as other.", "enum": [ "ordered" ], "type": "string", "x-extensible-enum": true }, "statusUrl": { "type": "string" } }, "required": [ "orderId", "order", "statusUrl", "state" ], "type": "object" }, { "properties": { "expired": { "type": "boolean" }, "state": { "description": "New values may be added; treat unknown values as other.", "enum": [ "notOrdered" ], "type": "string", "x-extensible-enum": true } }, "required": [ "expired", "state" ], "type": "object" }, { "properties": { "progress": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/QuoteOrderApprovalProgress", "description": "Public, read-only wallet progress; never signing bytes or credentials." } ] }, "state": { "description": "New values may be added; treat unknown values as other.", "enum": [ "unknown" ], "type": "string", "x-extensible-enum": true } }, "required": [ "state" ], "type": "object" } ], "x-extensible-enum": true }, "QuoteOrderRequest": { "additionalProperties": false, "description": "The strict order body: name a held quote and supply only the approval or evidence it asks for.", "properties": { "continuesOrderId": { "description": "The earlier multi-leg order this one finishes (\"Finish this trade\",\n`metadata.continuesOrderId`). The order path refuses it unless that order is asking its\ntaker to finish and this order spends exactly the funds it left. Protocol quotes only.", "type": [ "string", "null" ] }, "funding": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/VenueTradeFunding", "description": "`depositFirst` on a fiat venue card whose LP balance is short. Instead of\nrefusing FUNDING_SHORTFALL, the order records the person's consent to trade the\ncard's exact debit at no less than its receipt floor once their bank deposit is\ncredited; nothing is sent to the venue now. Absent is today's order. Human only." } ] }, "minReceive": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/DecimalAmount", "description": "The least the person accepts to receive, in receive-Asset units. Required when\nthe quote's `minReceiveRequired` is true. Other venue cards may accept it as an\nexplicit execution bound; protocol quotes refuse it." } ] }, "ownerAuthorization": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/QuoteOrderOwnerAuthorization", "description": "The pay wallet owner's approval, when the held binding pays from an embedded\nwallet (personal or organisation). The server names the wallet from the binding;\nthis carries only the owner's factor: the hosted approval preflight prepared\n(`walletAuthorization.authorizationId`), or an operation-bound RPC factor. Exclusive with\n`signature`. Protocol quotes only." } ] }, "priceProtectionBps": { "description": "Protocol price protection in basis points (1..=1000). May tighten, but never\nloosen, the held quote's protection without requesting a new price.", "format": "int32", "minimum": 0, "type": [ "integer", "null" ] }, "quoteId": { "description": "The held quote's id (`q_` and a ULID), as `POST /quotes` returned it.", "type": "string" }, "settlementWindowId": { "description": "The settlement window the trader consented to on a delayed venue trade. Absent, the\nquoted window is the consent; after a 409 `SETTLEMENT_WINDOW_CHANGED`, the re-sent order\nnames `currentWindow.windowId` from that refusal.", "format": "uuid", "type": [ "string", "null" ] }, "signature": { "description": "The taker's signature over the quote's `next.sign.typedData`; required exactly when\n`next` was `sign`.", "type": [ "string", "null" ] }, "sourceAuthorizationId": { "description": "An authorization this server issued at preflight for this quote's source leg\n(the native-Solana source permit, a programmable execution's key). Protocol quotes only.", "type": [ "string", "null" ] }, "sourceTransaction": { "description": "The hash (EVM) or signature (Solana) of a source transaction the member's\nwallet already broadcast on the quote's pay chain (a route's source, a programmable\nexecution, or a relayed source answered as awaiting finality). The order registers it\nand never broadcasts again; the server verifies it on chain. Protocol quotes only.", "type": [ "string", "null" ] }, "stepUpProof": { "description": "A `trade_authorization` step-up proof for a venue card, bound to the\nconfirmation key the refusal's `stepUp` names (`MFA_STALE`, `STEP_UP_REQUIRED`); the\nquote stays held for this retry. Ignored for a protocol quote.", "type": [ "string", "null" ], "writeOnly": true }, "tradePreparationId": { "description": "A venue trade this member already prepared on the quote's venue connection\n(for example one a Treasury review has since approved), so the order continues that\npreparation instead of preparing a new one. It must be the caller's, in this workspace,\non the held quote's connection, with bounds that cover the held quote. Venue cards only.", "format": "uuid", "type": [ "string", "null" ] }, "travelRule": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/QuoteOrderTravelRule", "description": "The Travel Rule data the member supplies for this transfer\n(`metadata.travelRule`). Protocol quotes only." } ] } }, "required": [ "quoteId" ], "type": "object" }, "QuoteOrderResponse": { "description": "What `POST /orders {quoteId}` created, read from the owner that saves it: a\nprotocol order in `orders`, or a workspace venue trade (fiat included) in the venue\ntrade operations. Nothing is recorded twice.\n\nNew values may be added; treat unknown values as other.", "oneOf": [ { "allOf": [ { "anyOf": [ { "$ref": "#/components/schemas/ResolvedTradingSource" }, { "not": { "anyOf": [ { "required": [ "tradingSource" ] }, { "required": [ "fundingModel" ] }, { "required": [ "settlement" ] }, { "required": [ "fundingAccount" ] }, { "required": [ "deliverTo" ] } ] } } ] }, { "$ref": "#/components/schemas/OrderExecutionReport", "description": "What the order executed and what it cost." }, { "properties": { "next": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/QuoteNextAction" } ] }, "order": { "$ref": "#/components/schemas/OrderResponse" }, "orderId": { "description": "The identifier accepted by `GET /api/v1/orders/{orderId}`.", "type": "string" }, "quoteId": { "type": [ "string", "null" ] }, "requestId": { "type": [ "string", "null" ] }, "status": { "$ref": "#/components/schemas/PublicOrderStatus" }, "statusUrl": { "description": "Where to read this order's status (`GET`). An API key needs the `orders_read` scope;\nplacing the order needed only `orders_write`.", "type": "string" }, "terminal": { "type": "boolean" } }, "required": [ "orderId", "statusUrl", "status", "terminal", "order" ], "type": "object" }, { "properties": { "kind": { "description": "New values may be added; treat unknown values as other.", "enum": [ "advancedTrade" ], "type": "string", "x-extensible-enum": true } }, "required": [ "kind" ], "type": "object" } ] }, { "allOf": [ { "anyOf": [ { "$ref": "#/components/schemas/ResolvedTradingSource" }, { "not": { "anyOf": [ { "required": [ "tradingSource" ] }, { "required": [ "fundingModel" ] }, { "required": [ "settlement" ] }, { "required": [ "fundingAccount" ] }, { "required": [ "deliverTo" ] } ] } } ] }, { "$ref": "#/components/schemas/OrderExecutionReport", "description": "What the order executed and what it cost." }, { "properties": { "next": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/QuoteNextAction" } ] }, "operation": { "$ref": "#/components/schemas/VenueTradeOperation" }, "orderId": { "description": "The operation identifier accepted by `GET /api/v1/orders/{orderId}`.", "type": "string" }, "quoteId": { "type": [ "string", "null" ] }, "requestId": { "type": [ "string", "null" ] }, "status": { "$ref": "#/components/schemas/PublicOrderStatus" }, "statusUrl": { "description": "Where to read this order (`GET`), with the `orders_read` API-key scope.", "type": "string" }, "terminal": { "type": "boolean" } }, "required": [ "orderId", "statusUrl", "status", "terminal", "operation" ], "type": "object" }, { "properties": { "kind": { "description": "New values may be added; treat unknown values as other.", "enum": [ "basicTrade" ], "type": "string", "x-extensible-enum": true } }, "required": [ "kind" ], "type": "object" } ] } ], "x-extensible-enum": true }, "QuoteOrderTravelRule": { "additionalProperties": false, "description": "Per-transaction Travel Rule data the member supplies (IVMS101 beneficiary name for a\nthird-party transfer); the originator comes from the account or company record.", "properties": { "beneficiaryName": { "type": "string" } }, "required": [ "beneficiaryName" ], "type": "object" }, "QuotePolicyRule": { "description": "The rule (or named refusal) that blocked a card. Rules carry no stored\nname; readers label one by `id` from the workspace's policy read.", "properties": { "catchAll": { "type": "boolean" }, "id": { "description": "A saved rule's id, a platform-default row's id, or the refusal code.", "type": "string" }, "position": { "description": "The rule's position in its policy; absent for a refusal.", "format": "int32", "type": [ "integer", "null" ] }, "source": { "$ref": "#/components/schemas/QuotePolicyRuleSource" } }, "required": [ "id", "source", "catchAll" ], "type": "object" }, "QuotePolicyRuleSource": { "description": "Where the blocking answer came from.\n\nNew values may be added; treat unknown values as other.", "enum": [ "saved", "platform_default", "refusal" ], "type": "string", "x-extensible-enum": true }, "QuoteRequestFilters": { "additionalProperties": false, "description": "The public request's narrowing filters; an omitted filter means all.", "properties": { "firmOnly": { "description": "`true` keeps only firm cards (`firm: true`): the venue is bound to the price until\n`expiresAt`. Indicative cards and executable estimates held to `minOut` are left out;\nabsent or `false` keeps all.", "type": [ "boolean", "null" ] }, "locations": { "items": { "$ref": "#/components/schemas/LocationKind" }, "type": [ "array", "null" ] }, "modalities": { "items": { "$ref": "#/components/schemas/VenueModality" }, "type": [ "array", "null" ] }, "variants": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/QuoteRequestVariants" } ] }, "venues": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/VenueFilter" } ] } }, "type": "object" }, "QuoteRequestOrder": { "description": "An order placed on a quote of a recorded request.", "properties": { "orderId": { "type": "string" }, "quoteId": { "type": "string" } }, "required": [ "quoteId", "orderId" ], "type": "object" }, "QuoteRequestQuote": { "allOf": [ { "$ref": "#/components/schemas/PairQuote" }, { "properties": { "liveState": { "$ref": "#/components/schemas/QuoteLiveState" } }, "required": [ "liveState" ], "type": "object" } ], "description": "A recorded card plus its current server-held state. Economics remain as served." }, "QuoteRequestRecord": { "description": "`GET /quotes/requests/{quoteRequestId}`: a quote request's recorded\nanswer, read back by its owner. It carries no executable part.", "properties": { "orders": { "description": "Every order placed on one of these quotes.", "items": { "$ref": "#/components/schemas/QuoteRequestOrder" }, "type": "array" }, "quoteRequestId": { "type": "string" }, "quotes": { "items": { "$ref": "#/components/schemas/QuoteRequestQuote" }, "type": "array" }, "request": { "$ref": "#/components/schemas/PairQuoteRequest", "description": "The request as it was sent, in the `POST /quotes` body shape (`sell`, `buy`, exactly one of\n`sellAmount` or `buyAmount`; the Binding by target id, never raw identity fields)." }, "requestedAt": { "format": "date-time", "type": "string" }, "requestedByYou": { "description": "Whether the caller is the principal that asked. Only that principal can order these quotes:\nanother member (`view_orders`) or an `orders_read` key reads them, and each `liveState` is\nthe hold as its owner sees it, never the reader's authority to order.", "type": "boolean" }, "sources": { "items": { "$ref": "#/components/schemas/QuoteSourceEntry" }, "type": "array" }, "venueAsked": { "type": "boolean" } }, "required": [ "quoteRequestId", "requestedAt", "request", "quotes", "sources", "venueAsked", "orders", "requestedByYou" ], "type": "object" }, "QuoteRequestVariants": { "additionalProperties": false, "description": "Which variants the sold and bought Assets accept.", "properties": { "buy": { "$ref": "#/components/schemas/VariantPreference" }, "sell": { "$ref": "#/components/schemas/VariantPreference" } }, "type": "object" }, "QuoteScreening": { "description": "Whether every bound wallet a quote uses was screened. A quote\nthat involves no wallet carries `null`.\n\nNew values may be added; treat unknown values as other.", "enum": [ "screened", "unscreened" ], "type": "string", "x-extensible-enum": true }, "QuoteSide": { "description": "One side of a quote: the Asset, where it is held, which variant and how much.", "properties": { "amount": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/DecimalAmount", "description": "`null` on a stub quote that carries no price (`sources[].priceOnRequest`)." } ] }, "asset": { "$ref": "#/components/schemas/AssetId" }, "chain": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/Caip2Chain", "description": "`null` for a side held on a venue account (off-chain)." } ] }, "variant": { "$ref": "#/components/schemas/AssetVariant", "description": "Every side carries a variant; a fiat side is `{kind: native, name:\n}`." } }, "required": [ "amount", "asset", "chain", "variant" ], "type": "object" }, "QuoteSideRequest": { "additionalProperties": false, "description": "One side of a quote request: an Asset, optionally pinned to a chain.", "properties": { "asset": { "$ref": "#/components/schemas/AssetId" }, "chain": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/Caip2Chain", "description": "Pins this side to one chain, which implies on-chain for this side." } ] } }, "required": [ "asset" ], "type": "object" }, "QuoteSort": { "description": "The order of `quotes[]`; ties break by venue id. There is no `recommended`.\n\nNew values may be added; treat unknown values as other.", "enum": [ "netReceived", "eta" ], "type": "string", "x-extensible-enum": true }, "QuoteSourceEntry": { "description": "One considered venue's outcome, a closed set tagged `status`:\n\n| status | meaning |\n|---|---|\n| `asking` | in flight on the stream only: the auction is consulting this venue now; its final outcome replaces it under the same venue key, and none remains at `complete` |\n| `answered` | the venue produced a quote |\n| `needsWallet` | no wallet of `family` to ask with |\n| `walletRefused` | the bound wallet is refused (`Revoked`, a confirmed sanctions hit) |\n| `firmQuoteLimited` | a desk's firm-quote cap applies; `explanation` is product copy |\n| `priceOnRequest` | no venue price was requested; `quoteId` identifies the held estimate or stub to Requote |\n| `askLimitReached` | the venue's ask limit is reached for now; `retryAfter` says when to ask again |\n| `timedOut` | no answer inside the deadline |\n| `refused` | the venue refused the live ask |\n| `restricted` | a gate kept the venue from this principal |\n| `unsupported` | the venue does not serve the pair |\n| `filteredOut` | the request's own filters exclude it (never a coverage or chain gap) |\n| `unavailable` | a read failed (`admissionUnavailable`, …) |\n\nAn unscreened default wallet is not a status: the quote carries `screening`. `venue`\nis the venue block, its `id` the one quote legs and `/prices` rows carry. Durations\n(`retryAfter`) are ISO 8601, counted from when the response was sent. Every entry\ncarries `asked`: whether this venue was consulted for this request: a live ask, or a\nfresh read of its published book or live desk price within that source's freshness\nwindow. An estimate no venue gave (a model or reference price) is not consulted, and\nan `answered` entry is always consulted. How a card's price was obtained is its own\nprice basis, never this flag.\n\nNew values may be added; treat unknown values as other.", "discriminator": { "propertyName": "status" }, "oneOf": [ { "description": "A venue the auction is consulting for this request, sent before its first quote\n(`asked` is always `true`). A venue refused before sending ends with that named\nrefusal and `asked: false`. Transient: the same venue key's final outcome replaces it,\nso it never appears in `complete` or the JSON reply.", "properties": { "asked": { "type": "boolean" }, "detail": { "type": [ "string", "null" ] }, "status": { "description": "New values may be added; treat unknown values as other.", "enum": [ "asking" ], "type": "string", "x-extensible-enum": true }, "venue": { "$ref": "#/components/schemas/QuoteVenue" } }, "required": [ "asked", "detail", "status", "venue" ], "type": "object" }, { "properties": { "asked": { "type": "boolean" }, "detail": { "type": [ "string", "null" ] }, "fix": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/QuoteSourceFix", "description": "The server-owned recovery step; absent on an unblocked or older source." } ] }, "product": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/BridgeTransferMode", "description": "The independently priced product, when this venue offers several." } ] }, "status": { "description": "New values may be added; treat unknown values as other.", "enum": [ "answered" ], "type": "string", "x-extensible-enum": true }, "venue": { "$ref": "#/components/schemas/QuoteVenue" } }, "required": [ "asked", "detail", "status", "venue" ], "type": "object" }, { "properties": { "asked": { "type": "boolean" }, "detail": { "type": [ "string", "null" ] }, "family": { "$ref": "#/components/schemas/ChainFamily" }, "fix": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/QuoteSourceFix", "description": "The server-owned recovery step; absent on an unblocked or older source." } ] }, "status": { "description": "New values may be added; treat unknown values as other.", "enum": [ "needsWallet" ], "type": "string", "x-extensible-enum": true }, "venue": { "$ref": "#/components/schemas/QuoteVenue" } }, "required": [ "asked", "detail", "family", "status", "venue" ], "type": "object" }, { "properties": { "asked": { "type": "boolean" }, "detail": { "type": [ "string", "null" ] }, "fix": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/QuoteSourceFix", "description": "The server-owned recovery step; absent on an unblocked or older source." } ] }, "product": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/BridgeTransferMode", "description": "The independently priced product, when this venue offers several." } ] }, "reason": { "description": "Known source reason tokens (not all apply to every status): `adapterPayloadSerializationFailed`, `basicVenueAccountsUnavailable`, `billingPaymentOverdue`, `walletNotOnChain`, `ccxtVenueRequiresCexLane`, `executionStageDisabled`, `jurisdictionUnproven`, `onboardedVenuesUnavailable`, `onchainAccountDefaultWalletRequired`, `onchainAccountDefaultWalletUnavailable`, `onchainAccountWalletRequired`, `onchainAssetDecimalsMismatch`, `onchainAssetIdentityMismatch`, `onchainAssetUnmapped`, `onchainAssetVariantFiltered`, `onchainWalletUnavailable`, `onchainCatalogueUnavailable`, `onchainDeliverToNotReceivingWallet`, `onchainDeliverToUnverified`, `onchainMarketsUnavailable`, `onchainMarketCatalogUnreadable`, `onchainMarketChainRequired`, `onchainMarketVariantRequired`, `onchainMarketTokenRequired`, `onchainSiteChainUnreadable`, `onchainWalletChainUnreadable`, `onchainWalletInactive`, `onchainWalletNotLinked`, `onchainWalletNotUsable`, `onchainWalletPickAmbiguous`, `onchainWalletWrongNetwork`, `signerLacksRight`, `signerUnavailable`, `signingGrantAmbiguous`, `signingGrantExpired`, `signingGrantRequired`, `signingGrantTokenNotKept`, `signingGrantTokenNotPayable`, `solverChainUnready`, `walletChainMismatch`, `walletNotUsableByYou`, `walletNotVerifiedForAce`, `walletNotWhitelisted`, `withdrawalChainUnsupported`, `accountFeeUnavailable`, `comparisonCostsUnavailable`, `connectionListingUnavailable`, `feeUnverified`, `noPool`, `noPrice`, `noSize`, `notFilled`, `notYetPublished`, `priceArithmetic`, `priceSourceNone`, `referenceMidUnavailable`, `settlementPrecisionUnavailable`, `accountSetupIncomplete`, `admissionUnavailable`, `advancedAccountEligibilityUnavailable`, `advancedAccountStateInconsistent`, `advancedConnectionDisabled`, `advancedConnectionNotConfigured`, `advancedConnectionPaused`, `advancedSettlementNeedsVerification`, `advancedModeDisabled`, `advancedNotAvailableForAccount`, `advancedNotEnabledForAccount`, `allowanceUnavailable`, `acrossCapacityExceeded`, `relayCapacityExceeded`, `acrossChainNotCarried`, `cctpChainNotCarried`, `relayChainNotCarried`, `apiKeyAdvancedWalletUnsupported`, `apiKeyOrganisationWalletScopeRequired`, `grantCapExceeded`, `amountAboveMaximum`, `amountBelowMinimum`, `amountUnreadable`, `amountsUnreadable`, `askFirst`, `authorityUnavailable`, `automationNeverAsks`, `availabilityUnreadable`, `backgroundNeverAsks`, `balanceUnreadable`, `defaultsUnavailable`, `walletHasNoAddress`, `walletUnavailable`, `bondAmountUnreadable`, `bondAssetUnreadable`, `catalogueUnavailable`, `chainFamilyUnknown`, `chainUnrecorded`, `clientSessionRequired`, `clockUnreadable`, `comingSoon`, `connectionChanged`, `connectionRevoked`, `corridorInvalid`, `credential`, `deadlineExceeded`, `defaultsLoading`, `deliverToCalldataUnsupported`, `deliverToTagUnsupported`, `deliverToNotPermitted`, `deliverToUnreadable`, `tradingPermissionRequired`, `directPatienceHarvest`, `economicallyInferior`, `exactAmountConflictsWithCard`, `exactAmountConflictsWithQuote`, `exactOutputDeliveryUnsupported`, `exactOutputEstimateUnavailable`, `exactRouteHypothesisUnavailable`, `expiredOnArrival`, `expiryUnknown`, `feeUnreadable`, `filteredOut`, `firmAskRefused`, `freshnessUnknown`, `fundingWindow`, `insufficientLiquidity`, `venueRelationship`, `venueRelationshipUnavailable`, `lpUnknown`, `mfaEnrolmentRequired`, `mfaRequired`, `minimumUnverified`, `mixedNetworks`, `netReceivedUnavailable`, `networkUnrecorded`, `noAddress`, `noCard`, `noFetcher`, `noInventory`, `noLaneForPair`, `noLegs`, `noOnChainCorridor`, `noPlannedVenue`, `noQuote`, `noRpc`, `notConnected`, `notEligible`, `notExecutable`, `orderPayloadMissing`, `outsideTopComposites`, `pairUnmapped`, `sellChainInvalid`, `permissionsUnreadable`, `placeOrderNotPermitted`, `prefundingMarkerUnreadable`, `prefundingRequired`, `indicative`, `priceOnRequest`, `priceOutOfRange`, `priceProtectionInvalid`, `pricingBookOnly`, `productNotQuoted`, `protocolChainMissing`, `providerFeeTreatmentUnknown`, `providerSiteUnrecorded`, `quoteIdUnissuable`, `quoteNotHeld`, `buyChainInvalid`, `buyAmountUnsupported`, `exactOutputDebitUnavailable`, `pairNotServed`, `receiveWalletNotServed`, `referenceMidUnreadable`, `referencePriceUnavailable`, `registryUnavailable`, `releaseRecheckUnavailable`, `requestUnbuildable`, `routeLegChainUnknown`, `routeLegUnnamed`, `routeLegUnplanned`, `routeUnavailable`, `secondFactorUnreadable`, `shortfallUnmeasured`, `shortfallUnreadable`, `singleChainVenue`, `siteChainUnreadable`, `sizeNotEligible`, `submitOrderBlocked`, `takerOnboardingIncomplete`, `tierNotQuoted`, `tradePaused`, `unsupportedNative`, `venueConnectionStorageUnavailable`, `venueDataStale`, `venueDeclined`, `venueNotConnected`, `venueNotEnabledForWorkspace`, `venueNotListed`, `venueTradeKeyUnavailable`, `venueTradeScopeRequired`, `venueTradeUnreadable`, `venueUnavailable`, `walletRefused`, `withdrawalFeeUnread`, `acrossRoutedViaCctp`, `apiKeyOrganisationWalletNotAllowlisted`, `balanceAvailabilityUnconfirmed`, `bankDestinationUnavailable`, `bebopJamKeyNotEnabled`, `bebopJamQuoteDeclined`, `bebopTokenUnavailable`, `relayCurrencyUnsupported`, `relaySwapImpactTooHigh`, `tetrafiSolverCallbackNotAuthorized`, `tradingLinkSnapshotChanged`, `tradingLinkSnapshotUnavailable`, `uniswapChainReadUnavailable`, `uniswapInsufficientDepth`, `uniswapQuoteUnreadable`, `uniswapUnwrapAboveDailyCap`, `uniswapUnwrapAboveTradeCap`, `uniswapRouteNotGranted`, `venueNotEnabled`, `askLimitReached`, `balanceMeaningUnconfirmed`, `bebopJamWalletUnsupported`, `bebopQuorumWalletTooSlow`, `bebopWalletQuorumUnreadable`, `connectionNotConfigured`, `deliveryAccountNetworkUnavailable`, `deliveryAccountUnavailable`, `destinationCannotSendOnChain`, `dexReferencePriceUnavailable`, `firmQuoteLimited`, `fundingAccountNetworkUnavailable`, `fundingAccountUnavailable`, `insufficientDepth`, `missingPermission`, `needsNativeGas`, `needsWallet`, `notPriced`, `payInTermsUnavailable`, `pilotTradeCapExceeded`, `platformFeeRateUnavailable`, `pricingBookPairUnserved`, `settlementDeclarationUnavailable`, `settlementNotAvailable`, `timedOut`, `timedOutBeforeSend`, `tradingSourceNetworkUnavailable`, `tradingSourceNotLinked`, `venueEnablementRechecking`, `venueEnablementUnavailable`, `venueListingTimedOut`, `venuePoliciesUnavailable`.\n\nNew values may be added; treat unknown values as other.", "type": [ "string", "null" ] }, "recovery": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/WalletLinkRecovery" } ] }, "status": { "description": "New values may be added; treat unknown values as other.", "enum": [ "walletRefused" ], "type": "string", "x-extensible-enum": true }, "venue": { "$ref": "#/components/schemas/QuoteVenue" }, "wallet": { "type": "string" } }, "required": [ "asked", "detail", "status", "venue", "wallet" ], "type": "object" }, { "properties": { "asked": { "type": "boolean" }, "code": { "description": "VENUE_QUOTE_RATE_LIMITED for a provider throttle; VENUE_FIRM_QUOTE_LIMITED for a workspace cap.", "example": "VENUE_QUOTE_RATE_LIMITED", "type": [ "string", "null" ] }, "detail": { "type": [ "string", "null" ] }, "explanation": { "type": "string" }, "fix": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/QuoteSourceFix", "description": "The server-owned recovery step; absent on an unblocked or older source." } ] }, "retryAfter": { "$ref": "#/components/schemas/IsoDuration" }, "retrySource": { "description": "The native provider retry field, provider:legacyLpReported for old stored blocks,\ntetrafi:declaredPool for our pool, or explicit AQ09_DEFAULT.cooldown.", "example": "provider:Retry-After", "type": [ "string", "null" ] }, "status": { "description": "New values may be added; treat unknown values as other.", "enum": [ "firmQuoteLimited" ], "type": "string", "x-extensible-enum": true }, "venue": { "$ref": "#/components/schemas/QuoteVenue" } }, "required": [ "asked", "detail", "explanation", "retryAfter", "status", "venue" ], "type": "object" }, { "description": "A priced indicative card from a venue read or estimate, without a firm-price ask.\n`asked` is false when this request did not consult the venue. The card's\n`firmAsk` declares whether the binding price comes on request or at execution.", "properties": { "asked": { "type": "boolean" }, "detail": { "type": [ "string", "null" ] }, "fix": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/QuoteSourceFix", "description": "The server-owned recovery step; absent on an unblocked or older source." } ] }, "product": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/BridgeTransferMode", "description": "The independently priced product, when this venue offers several." } ] }, "quoteId": { "type": "string" }, "status": { "description": "New values may be added; treat unknown values as other.", "enum": [ "indicative" ], "type": "string", "x-extensible-enum": true }, "venue": { "$ref": "#/components/schemas/QuoteVenue" } }, "required": [ "asked", "detail", "quoteId", "status", "venue" ], "type": "object" }, { "properties": { "asked": { "type": "boolean" }, "detail": { "type": [ "string", "null" ] }, "fix": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/QuoteSourceFix", "description": "The server-owned recovery step; absent on an unblocked or older source." } ] }, "quoteId": { "type": "string" }, "status": { "description": "New values may be added; treat unknown values as other.", "enum": [ "priceOnRequest" ], "type": "string", "x-extensible-enum": true }, "venue": { "$ref": "#/components/schemas/QuoteVenue" } }, "required": [ "asked", "detail", "quoteId", "status", "venue" ], "type": "object" }, { "properties": { "asked": { "type": "boolean" }, "detail": { "type": [ "string", "null" ] }, "fix": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/QuoteSourceFix", "description": "The server-owned recovery step; absent on an unblocked or older source." } ] }, "retryAfter": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/IsoDuration" } ] }, "status": { "description": "New values may be added; treat unknown values as other.", "enum": [ "askLimitReached" ], "type": "string", "x-extensible-enum": true }, "venue": { "$ref": "#/components/schemas/QuoteVenue" } }, "required": [ "asked", "detail", "retryAfter", "status", "venue" ], "type": "object" }, { "properties": { "asked": { "type": "boolean" }, "detail": { "type": [ "string", "null" ] }, "fix": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/QuoteSourceFix", "description": "The server-owned recovery step; absent on an unblocked or older source." } ] }, "network": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/Caip2Chain", "description": "The one network this outcome belongs to: a single-chain route of a venue that holds one\naccount per network, so it sits on that network's line beside the venue's account there.\nAbsent for a route that spans several networks or names none." } ] }, "product": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/BridgeTransferMode", "description": "The independently priced product, when this venue offers several." } ] }, "status": { "description": "New values may be added; treat unknown values as other.", "enum": [ "timedOut" ], "type": "string", "x-extensible-enum": true }, "venue": { "$ref": "#/components/schemas/QuoteVenue" } }, "required": [ "asked", "detail", "status", "venue" ], "type": "object" }, { "properties": { "asked": { "type": "boolean" }, "detail": { "type": [ "string", "null" ] }, "fix": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/QuoteSourceFix", "description": "The server-owned recovery step; absent on an unblocked or older source." } ] }, "network": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/Caip2Chain", "description": "The one network this outcome belongs to: a single-chain route of a venue that holds one\naccount per network, so it sits on that network's line beside the venue's account there.\nAbsent for a route that spans several networks or names none." } ] }, "reason": { "description": "Known source reason tokens (not all apply to every status): `adapterPayloadSerializationFailed`, `basicVenueAccountsUnavailable`, `billingPaymentOverdue`, `walletNotOnChain`, `ccxtVenueRequiresCexLane`, `executionStageDisabled`, `jurisdictionUnproven`, `onboardedVenuesUnavailable`, `onchainAccountDefaultWalletRequired`, `onchainAccountDefaultWalletUnavailable`, `onchainAccountWalletRequired`, `onchainAssetDecimalsMismatch`, `onchainAssetIdentityMismatch`, `onchainAssetUnmapped`, `onchainAssetVariantFiltered`, `onchainWalletUnavailable`, `onchainCatalogueUnavailable`, `onchainDeliverToNotReceivingWallet`, `onchainDeliverToUnverified`, `onchainMarketsUnavailable`, `onchainMarketCatalogUnreadable`, `onchainMarketChainRequired`, `onchainMarketVariantRequired`, `onchainMarketTokenRequired`, `onchainSiteChainUnreadable`, `onchainWalletChainUnreadable`, `onchainWalletInactive`, `onchainWalletNotLinked`, `onchainWalletNotUsable`, `onchainWalletPickAmbiguous`, `onchainWalletWrongNetwork`, `signerLacksRight`, `signerUnavailable`, `signingGrantAmbiguous`, `signingGrantExpired`, `signingGrantRequired`, `signingGrantTokenNotKept`, `signingGrantTokenNotPayable`, `solverChainUnready`, `walletChainMismatch`, `walletNotUsableByYou`, `walletNotVerifiedForAce`, `walletNotWhitelisted`, `withdrawalChainUnsupported`, `accountFeeUnavailable`, `comparisonCostsUnavailable`, `connectionListingUnavailable`, `feeUnverified`, `noPool`, `noPrice`, `noSize`, `notFilled`, `notYetPublished`, `priceArithmetic`, `priceSourceNone`, `referenceMidUnavailable`, `settlementPrecisionUnavailable`, `accountSetupIncomplete`, `admissionUnavailable`, `advancedAccountEligibilityUnavailable`, `advancedAccountStateInconsistent`, `advancedConnectionDisabled`, `advancedConnectionNotConfigured`, `advancedConnectionPaused`, `advancedSettlementNeedsVerification`, `advancedModeDisabled`, `advancedNotAvailableForAccount`, `advancedNotEnabledForAccount`, `allowanceUnavailable`, `acrossCapacityExceeded`, `relayCapacityExceeded`, `acrossChainNotCarried`, `cctpChainNotCarried`, `relayChainNotCarried`, `apiKeyAdvancedWalletUnsupported`, `apiKeyOrganisationWalletScopeRequired`, `grantCapExceeded`, `amountAboveMaximum`, `amountBelowMinimum`, `amountUnreadable`, `amountsUnreadable`, `askFirst`, `authorityUnavailable`, `automationNeverAsks`, `availabilityUnreadable`, `backgroundNeverAsks`, `balanceUnreadable`, `defaultsUnavailable`, `walletHasNoAddress`, `walletUnavailable`, `bondAmountUnreadable`, `bondAssetUnreadable`, `catalogueUnavailable`, `chainFamilyUnknown`, `chainUnrecorded`, `clientSessionRequired`, `clockUnreadable`, `comingSoon`, `connectionChanged`, `connectionRevoked`, `corridorInvalid`, `credential`, `deadlineExceeded`, `defaultsLoading`, `deliverToCalldataUnsupported`, `deliverToTagUnsupported`, `deliverToNotPermitted`, `deliverToUnreadable`, `tradingPermissionRequired`, `directPatienceHarvest`, `economicallyInferior`, `exactAmountConflictsWithCard`, `exactAmountConflictsWithQuote`, `exactOutputDeliveryUnsupported`, `exactOutputEstimateUnavailable`, `exactRouteHypothesisUnavailable`, `expiredOnArrival`, `expiryUnknown`, `feeUnreadable`, `filteredOut`, `firmAskRefused`, `freshnessUnknown`, `fundingWindow`, `insufficientLiquidity`, `venueRelationship`, `venueRelationshipUnavailable`, `lpUnknown`, `mfaEnrolmentRequired`, `mfaRequired`, `minimumUnverified`, `mixedNetworks`, `netReceivedUnavailable`, `networkUnrecorded`, `noAddress`, `noCard`, `noFetcher`, `noInventory`, `noLaneForPair`, `noLegs`, `noOnChainCorridor`, `noPlannedVenue`, `noQuote`, `noRpc`, `notConnected`, `notEligible`, `notExecutable`, `orderPayloadMissing`, `outsideTopComposites`, `pairUnmapped`, `sellChainInvalid`, `permissionsUnreadable`, `placeOrderNotPermitted`, `prefundingMarkerUnreadable`, `prefundingRequired`, `indicative`, `priceOnRequest`, `priceOutOfRange`, `priceProtectionInvalid`, `pricingBookOnly`, `productNotQuoted`, `protocolChainMissing`, `providerFeeTreatmentUnknown`, `providerSiteUnrecorded`, `quoteIdUnissuable`, `quoteNotHeld`, `buyChainInvalid`, `buyAmountUnsupported`, `exactOutputDebitUnavailable`, `pairNotServed`, `receiveWalletNotServed`, `referenceMidUnreadable`, `referencePriceUnavailable`, `registryUnavailable`, `releaseRecheckUnavailable`, `requestUnbuildable`, `routeLegChainUnknown`, `routeLegUnnamed`, `routeLegUnplanned`, `routeUnavailable`, `secondFactorUnreadable`, `shortfallUnmeasured`, `shortfallUnreadable`, `singleChainVenue`, `siteChainUnreadable`, `sizeNotEligible`, `submitOrderBlocked`, `takerOnboardingIncomplete`, `tierNotQuoted`, `tradePaused`, `unsupportedNative`, `venueConnectionStorageUnavailable`, `venueDataStale`, `venueDeclined`, `venueNotConnected`, `venueNotEnabledForWorkspace`, `venueNotListed`, `venueTradeKeyUnavailable`, `venueTradeScopeRequired`, `venueTradeUnreadable`, `venueUnavailable`, `walletRefused`, `withdrawalFeeUnread`, `acrossRoutedViaCctp`, `apiKeyOrganisationWalletNotAllowlisted`, `balanceAvailabilityUnconfirmed`, `bankDestinationUnavailable`, `bebopJamKeyNotEnabled`, `bebopJamQuoteDeclined`, `bebopTokenUnavailable`, `relayCurrencyUnsupported`, `relaySwapImpactTooHigh`, `tetrafiSolverCallbackNotAuthorized`, `tradingLinkSnapshotChanged`, `tradingLinkSnapshotUnavailable`, `uniswapChainReadUnavailable`, `uniswapInsufficientDepth`, `uniswapQuoteUnreadable`, `uniswapUnwrapAboveDailyCap`, `uniswapUnwrapAboveTradeCap`, `uniswapRouteNotGranted`, `venueNotEnabled`, `askLimitReached`, `balanceMeaningUnconfirmed`, `bebopJamWalletUnsupported`, `bebopQuorumWalletTooSlow`, `bebopWalletQuorumUnreadable`, `connectionNotConfigured`, `deliveryAccountNetworkUnavailable`, `deliveryAccountUnavailable`, `destinationCannotSendOnChain`, `dexReferencePriceUnavailable`, `firmQuoteLimited`, `fundingAccountNetworkUnavailable`, `fundingAccountUnavailable`, `insufficientDepth`, `missingPermission`, `needsNativeGas`, `needsWallet`, `notPriced`, `payInTermsUnavailable`, `pilotTradeCapExceeded`, `platformFeeRateUnavailable`, `pricingBookPairUnserved`, `settlementDeclarationUnavailable`, `settlementNotAvailable`, `timedOut`, `timedOutBeforeSend`, `tradingSourceNetworkUnavailable`, `tradingSourceNotLinked`, `venueEnablementRechecking`, `venueEnablementUnavailable`, `venueListingTimedOut`, `venuePoliciesUnavailable`.\n\nNew values may be added; treat unknown values as other.", "type": "string" }, "status": { "description": "New values may be added; treat unknown values as other.", "enum": [ "refused" ], "type": "string", "x-extensible-enum": true }, "venue": { "$ref": "#/components/schemas/QuoteVenue" } }, "required": [ "asked", "detail", "reason", "status", "venue" ], "type": "object" }, { "properties": { "asked": { "type": "boolean" }, "detail": { "type": [ "string", "null" ] }, "fix": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/QuoteSourceFix", "description": "The server-owned recovery step; absent on an unblocked or older source." } ] }, "reason": { "$ref": "#/components/schemas/RestrictedReason", "description": "Known source reason tokens (not all apply to every status): `adapterPayloadSerializationFailed`, `basicVenueAccountsUnavailable`, `billingPaymentOverdue`, `walletNotOnChain`, `ccxtVenueRequiresCexLane`, `executionStageDisabled`, `jurisdictionUnproven`, `onboardedVenuesUnavailable`, `onchainAccountDefaultWalletRequired`, `onchainAccountDefaultWalletUnavailable`, `onchainAccountWalletRequired`, `onchainAssetDecimalsMismatch`, `onchainAssetIdentityMismatch`, `onchainAssetUnmapped`, `onchainAssetVariantFiltered`, `onchainWalletUnavailable`, `onchainCatalogueUnavailable`, `onchainDeliverToNotReceivingWallet`, `onchainDeliverToUnverified`, `onchainMarketsUnavailable`, `onchainMarketCatalogUnreadable`, `onchainMarketChainRequired`, `onchainMarketVariantRequired`, `onchainMarketTokenRequired`, `onchainSiteChainUnreadable`, `onchainWalletChainUnreadable`, `onchainWalletInactive`, `onchainWalletNotLinked`, `onchainWalletNotUsable`, `onchainWalletPickAmbiguous`, `onchainWalletWrongNetwork`, `signerLacksRight`, `signerUnavailable`, `signingGrantAmbiguous`, `signingGrantExpired`, `signingGrantRequired`, `signingGrantTokenNotKept`, `signingGrantTokenNotPayable`, `solverChainUnready`, `walletChainMismatch`, `walletNotUsableByYou`, `walletNotVerifiedForAce`, `walletNotWhitelisted`, `withdrawalChainUnsupported`, `accountFeeUnavailable`, `comparisonCostsUnavailable`, `connectionListingUnavailable`, `feeUnverified`, `noPool`, `noPrice`, `noSize`, `notFilled`, `notYetPublished`, `priceArithmetic`, `priceSourceNone`, `referenceMidUnavailable`, `settlementPrecisionUnavailable`, `accountSetupIncomplete`, `admissionUnavailable`, `advancedAccountEligibilityUnavailable`, `advancedAccountStateInconsistent`, `advancedConnectionDisabled`, `advancedConnectionNotConfigured`, `advancedConnectionPaused`, `advancedSettlementNeedsVerification`, `advancedModeDisabled`, `advancedNotAvailableForAccount`, `advancedNotEnabledForAccount`, `allowanceUnavailable`, `acrossCapacityExceeded`, `relayCapacityExceeded`, `acrossChainNotCarried`, `cctpChainNotCarried`, `relayChainNotCarried`, `apiKeyAdvancedWalletUnsupported`, `apiKeyOrganisationWalletScopeRequired`, `grantCapExceeded`, `amountAboveMaximum`, `amountBelowMinimum`, `amountUnreadable`, `amountsUnreadable`, `askFirst`, `authorityUnavailable`, `automationNeverAsks`, `availabilityUnreadable`, `backgroundNeverAsks`, `balanceUnreadable`, `defaultsUnavailable`, `walletHasNoAddress`, `walletUnavailable`, `bondAmountUnreadable`, `bondAssetUnreadable`, `catalogueUnavailable`, `chainFamilyUnknown`, `chainUnrecorded`, `clientSessionRequired`, `clockUnreadable`, `comingSoon`, `connectionChanged`, `connectionRevoked`, `corridorInvalid`, `credential`, `deadlineExceeded`, `defaultsLoading`, `deliverToCalldataUnsupported`, `deliverToTagUnsupported`, `deliverToNotPermitted`, `deliverToUnreadable`, `tradingPermissionRequired`, `directPatienceHarvest`, `economicallyInferior`, `exactAmountConflictsWithCard`, `exactAmountConflictsWithQuote`, `exactOutputDeliveryUnsupported`, `exactOutputEstimateUnavailable`, `exactRouteHypothesisUnavailable`, `expiredOnArrival`, `expiryUnknown`, `feeUnreadable`, `filteredOut`, `firmAskRefused`, `freshnessUnknown`, `fundingWindow`, `insufficientLiquidity`, `venueRelationship`, `venueRelationshipUnavailable`, `lpUnknown`, `mfaEnrolmentRequired`, `mfaRequired`, `minimumUnverified`, `mixedNetworks`, `netReceivedUnavailable`, `networkUnrecorded`, `noAddress`, `noCard`, `noFetcher`, `noInventory`, `noLaneForPair`, `noLegs`, `noOnChainCorridor`, `noPlannedVenue`, `noQuote`, `noRpc`, `notConnected`, `notEligible`, `notExecutable`, `orderPayloadMissing`, `outsideTopComposites`, `pairUnmapped`, `sellChainInvalid`, `permissionsUnreadable`, `placeOrderNotPermitted`, `prefundingMarkerUnreadable`, `prefundingRequired`, `indicative`, `priceOnRequest`, `priceOutOfRange`, `priceProtectionInvalid`, `pricingBookOnly`, `productNotQuoted`, `protocolChainMissing`, `providerFeeTreatmentUnknown`, `providerSiteUnrecorded`, `quoteIdUnissuable`, `quoteNotHeld`, `buyChainInvalid`, `buyAmountUnsupported`, `exactOutputDebitUnavailable`, `pairNotServed`, `receiveWalletNotServed`, `referenceMidUnreadable`, `referencePriceUnavailable`, `registryUnavailable`, `releaseRecheckUnavailable`, `requestUnbuildable`, `routeLegChainUnknown`, `routeLegUnnamed`, `routeLegUnplanned`, `routeUnavailable`, `secondFactorUnreadable`, `shortfallUnmeasured`, `shortfallUnreadable`, `singleChainVenue`, `siteChainUnreadable`, `sizeNotEligible`, `submitOrderBlocked`, `takerOnboardingIncomplete`, `tierNotQuoted`, `tradePaused`, `unsupportedNative`, `venueConnectionStorageUnavailable`, `venueDataStale`, `venueDeclined`, `venueNotConnected`, `venueNotEnabledForWorkspace`, `venueNotListed`, `venueTradeKeyUnavailable`, `venueTradeScopeRequired`, `venueTradeUnreadable`, `venueUnavailable`, `walletRefused`, `withdrawalFeeUnread`, `acrossRoutedViaCctp`, `apiKeyOrganisationWalletNotAllowlisted`, `balanceAvailabilityUnconfirmed`, `bankDestinationUnavailable`, `bebopJamKeyNotEnabled`, `bebopJamQuoteDeclined`, `bebopTokenUnavailable`, `relayCurrencyUnsupported`, `relaySwapImpactTooHigh`, `tetrafiSolverCallbackNotAuthorized`, `tradingLinkSnapshotChanged`, `tradingLinkSnapshotUnavailable`, `uniswapChainReadUnavailable`, `uniswapInsufficientDepth`, `uniswapQuoteUnreadable`, `uniswapUnwrapAboveDailyCap`, `uniswapUnwrapAboveTradeCap`, `uniswapRouteNotGranted`, `venueNotEnabled`, `askLimitReached`, `balanceMeaningUnconfirmed`, `bebopJamWalletUnsupported`, `bebopQuorumWalletTooSlow`, `bebopWalletQuorumUnreadable`, `connectionNotConfigured`, `deliveryAccountNetworkUnavailable`, `deliveryAccountUnavailable`, `destinationCannotSendOnChain`, `dexReferencePriceUnavailable`, `firmQuoteLimited`, `fundingAccountNetworkUnavailable`, `fundingAccountUnavailable`, `insufficientDepth`, `missingPermission`, `needsNativeGas`, `needsWallet`, `notPriced`, `payInTermsUnavailable`, `pilotTradeCapExceeded`, `platformFeeRateUnavailable`, `pricingBookPairUnserved`, `settlementDeclarationUnavailable`, `settlementNotAvailable`, `timedOut`, `timedOutBeforeSend`, `tradingSourceNetworkUnavailable`, `tradingSourceNotLinked`, `venueEnablementRechecking`, `venueEnablementUnavailable`, `venueListingTimedOut`, `venuePoliciesUnavailable`.\n\nNew values may be added; treat unknown values as other." }, "status": { "description": "New values may be added; treat unknown values as other.", "enum": [ "restricted" ], "type": "string", "x-extensible-enum": true }, "venue": { "$ref": "#/components/schemas/QuoteVenue" } }, "required": [ "asked", "detail", "reason", "status", "venue" ], "type": "object" }, { "properties": { "asked": { "type": "boolean" }, "detail": { "type": [ "string", "null" ] }, "fix": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/QuoteSourceFix", "description": "The server-owned recovery step; absent on an unblocked or older source." } ] }, "network": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/Caip2Chain", "description": "The one network this outcome belongs to: a single-chain route of a venue that holds one\naccount per network, so it sits on that network's line beside the venue's account there.\nAbsent for a route that spans several networks or names none." } ] }, "reason": { "description": "Known source reason tokens (not all apply to every status): `adapterPayloadSerializationFailed`, `basicVenueAccountsUnavailable`, `billingPaymentOverdue`, `walletNotOnChain`, `ccxtVenueRequiresCexLane`, `executionStageDisabled`, `jurisdictionUnproven`, `onboardedVenuesUnavailable`, `onchainAccountDefaultWalletRequired`, `onchainAccountDefaultWalletUnavailable`, `onchainAccountWalletRequired`, `onchainAssetDecimalsMismatch`, `onchainAssetIdentityMismatch`, `onchainAssetUnmapped`, `onchainAssetVariantFiltered`, `onchainWalletUnavailable`, `onchainCatalogueUnavailable`, `onchainDeliverToNotReceivingWallet`, `onchainDeliverToUnverified`, `onchainMarketsUnavailable`, `onchainMarketCatalogUnreadable`, `onchainMarketChainRequired`, `onchainMarketVariantRequired`, `onchainMarketTokenRequired`, `onchainSiteChainUnreadable`, `onchainWalletChainUnreadable`, `onchainWalletInactive`, `onchainWalletNotLinked`, `onchainWalletNotUsable`, `onchainWalletPickAmbiguous`, `onchainWalletWrongNetwork`, `signerLacksRight`, `signerUnavailable`, `signingGrantAmbiguous`, `signingGrantExpired`, `signingGrantRequired`, `signingGrantTokenNotKept`, `signingGrantTokenNotPayable`, `solverChainUnready`, `walletChainMismatch`, `walletNotUsableByYou`, `walletNotVerifiedForAce`, `walletNotWhitelisted`, `withdrawalChainUnsupported`, `accountFeeUnavailable`, `comparisonCostsUnavailable`, `connectionListingUnavailable`, `feeUnverified`, `noPool`, `noPrice`, `noSize`, `notFilled`, `notYetPublished`, `priceArithmetic`, `priceSourceNone`, `referenceMidUnavailable`, `settlementPrecisionUnavailable`, `accountSetupIncomplete`, `admissionUnavailable`, `advancedAccountEligibilityUnavailable`, `advancedAccountStateInconsistent`, `advancedConnectionDisabled`, `advancedConnectionNotConfigured`, `advancedConnectionPaused`, `advancedSettlementNeedsVerification`, `advancedModeDisabled`, `advancedNotAvailableForAccount`, `advancedNotEnabledForAccount`, `allowanceUnavailable`, `acrossCapacityExceeded`, `relayCapacityExceeded`, `acrossChainNotCarried`, `cctpChainNotCarried`, `relayChainNotCarried`, `apiKeyAdvancedWalletUnsupported`, `apiKeyOrganisationWalletScopeRequired`, `grantCapExceeded`, `amountAboveMaximum`, `amountBelowMinimum`, `amountUnreadable`, `amountsUnreadable`, `askFirst`, `authorityUnavailable`, `automationNeverAsks`, `availabilityUnreadable`, `backgroundNeverAsks`, `balanceUnreadable`, `defaultsUnavailable`, `walletHasNoAddress`, `walletUnavailable`, `bondAmountUnreadable`, `bondAssetUnreadable`, `catalogueUnavailable`, `chainFamilyUnknown`, `chainUnrecorded`, `clientSessionRequired`, `clockUnreadable`, `comingSoon`, `connectionChanged`, `connectionRevoked`, `corridorInvalid`, `credential`, `deadlineExceeded`, `defaultsLoading`, `deliverToCalldataUnsupported`, `deliverToTagUnsupported`, `deliverToNotPermitted`, `deliverToUnreadable`, `tradingPermissionRequired`, `directPatienceHarvest`, `economicallyInferior`, `exactAmountConflictsWithCard`, `exactAmountConflictsWithQuote`, `exactOutputDeliveryUnsupported`, `exactOutputEstimateUnavailable`, `exactRouteHypothesisUnavailable`, `expiredOnArrival`, `expiryUnknown`, `feeUnreadable`, `filteredOut`, `firmAskRefused`, `freshnessUnknown`, `fundingWindow`, `insufficientLiquidity`, `venueRelationship`, `venueRelationshipUnavailable`, `lpUnknown`, `mfaEnrolmentRequired`, `mfaRequired`, `minimumUnverified`, `mixedNetworks`, `netReceivedUnavailable`, `networkUnrecorded`, `noAddress`, `noCard`, `noFetcher`, `noInventory`, `noLaneForPair`, `noLegs`, `noOnChainCorridor`, `noPlannedVenue`, `noQuote`, `noRpc`, `notConnected`, `notEligible`, `notExecutable`, `orderPayloadMissing`, `outsideTopComposites`, `pairUnmapped`, `sellChainInvalid`, `permissionsUnreadable`, `placeOrderNotPermitted`, `prefundingMarkerUnreadable`, `prefundingRequired`, `indicative`, `priceOnRequest`, `priceOutOfRange`, `priceProtectionInvalid`, `pricingBookOnly`, `productNotQuoted`, `protocolChainMissing`, `providerFeeTreatmentUnknown`, `providerSiteUnrecorded`, `quoteIdUnissuable`, `quoteNotHeld`, `buyChainInvalid`, `buyAmountUnsupported`, `exactOutputDebitUnavailable`, `pairNotServed`, `receiveWalletNotServed`, `referenceMidUnreadable`, `referencePriceUnavailable`, `registryUnavailable`, `releaseRecheckUnavailable`, `requestUnbuildable`, `routeLegChainUnknown`, `routeLegUnnamed`, `routeLegUnplanned`, `routeUnavailable`, `secondFactorUnreadable`, `shortfallUnmeasured`, `shortfallUnreadable`, `singleChainVenue`, `siteChainUnreadable`, `sizeNotEligible`, `submitOrderBlocked`, `takerOnboardingIncomplete`, `tierNotQuoted`, `tradePaused`, `unsupportedNative`, `venueConnectionStorageUnavailable`, `venueDataStale`, `venueDeclined`, `venueNotConnected`, `venueNotEnabledForWorkspace`, `venueNotListed`, `venueTradeKeyUnavailable`, `venueTradeScopeRequired`, `venueTradeUnreadable`, `venueUnavailable`, `walletRefused`, `withdrawalFeeUnread`, `acrossRoutedViaCctp`, `apiKeyOrganisationWalletNotAllowlisted`, `balanceAvailabilityUnconfirmed`, `bankDestinationUnavailable`, `bebopJamKeyNotEnabled`, `bebopJamQuoteDeclined`, `bebopTokenUnavailable`, `relayCurrencyUnsupported`, `relaySwapImpactTooHigh`, `tetrafiSolverCallbackNotAuthorized`, `tradingLinkSnapshotChanged`, `tradingLinkSnapshotUnavailable`, `uniswapChainReadUnavailable`, `uniswapInsufficientDepth`, `uniswapQuoteUnreadable`, `uniswapUnwrapAboveDailyCap`, `uniswapUnwrapAboveTradeCap`, `uniswapRouteNotGranted`, `venueNotEnabled`, `askLimitReached`, `balanceMeaningUnconfirmed`, `bebopJamWalletUnsupported`, `bebopQuorumWalletTooSlow`, `bebopWalletQuorumUnreadable`, `connectionNotConfigured`, `deliveryAccountNetworkUnavailable`, `deliveryAccountUnavailable`, `destinationCannotSendOnChain`, `dexReferencePriceUnavailable`, `firmQuoteLimited`, `fundingAccountNetworkUnavailable`, `fundingAccountUnavailable`, `insufficientDepth`, `missingPermission`, `needsNativeGas`, `needsWallet`, `notPriced`, `payInTermsUnavailable`, `pilotTradeCapExceeded`, `platformFeeRateUnavailable`, `pricingBookPairUnserved`, `settlementDeclarationUnavailable`, `settlementNotAvailable`, `timedOut`, `timedOutBeforeSend`, `tradingSourceNetworkUnavailable`, `tradingSourceNotLinked`, `venueEnablementRechecking`, `venueEnablementUnavailable`, `venueListingTimedOut`, `venuePoliciesUnavailable`.\n\nNew values may be added; treat unknown values as other.", "type": "string" }, "sizeLimits": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/VenueRfqSizeObservation" } ] }, "status": { "description": "New values may be added; treat unknown values as other.", "enum": [ "unsupported" ], "type": "string", "x-extensible-enum": true }, "venue": { "$ref": "#/components/schemas/QuoteVenue" } }, "required": [ "asked", "detail", "reason", "status", "venue" ], "type": "object" }, { "properties": { "asked": { "type": "boolean" }, "detail": { "type": [ "string", "null" ] }, "fix": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/QuoteSourceFix", "description": "The server-owned recovery step; absent on an unblocked or older source." } ] }, "status": { "description": "New values may be added; treat unknown values as other.", "enum": [ "filteredOut" ], "type": "string", "x-extensible-enum": true }, "venue": { "$ref": "#/components/schemas/QuoteVenue" } }, "required": [ "asked", "detail", "status", "venue" ], "type": "object" }, { "properties": { "asked": { "type": "boolean" }, "detail": { "type": [ "string", "null" ] }, "fix": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/QuoteSourceFix", "description": "The server-owned recovery step; absent on an unblocked or older source." } ] }, "network": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/Caip2Chain", "description": "The paying network a venue account's wallet-default refusal names\n(`ONCHAIN_ACCOUNT_DEFAULT_WALLET_REQUIRED` / `_UNAVAILABLE`), so a client\nnever parses it out of `detail`. Absent when the refusal names no single network." } ] }, "product": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/BridgeTransferMode", "description": "The independently priced product, when this venue offers several." } ] }, "reason": { "description": "Known source reason tokens (not all apply to every status): `adapterPayloadSerializationFailed`, `basicVenueAccountsUnavailable`, `billingPaymentOverdue`, `walletNotOnChain`, `ccxtVenueRequiresCexLane`, `executionStageDisabled`, `jurisdictionUnproven`, `onboardedVenuesUnavailable`, `onchainAccountDefaultWalletRequired`, `onchainAccountDefaultWalletUnavailable`, `onchainAccountWalletRequired`, `onchainAssetDecimalsMismatch`, `onchainAssetIdentityMismatch`, `onchainAssetUnmapped`, `onchainAssetVariantFiltered`, `onchainWalletUnavailable`, `onchainCatalogueUnavailable`, `onchainDeliverToNotReceivingWallet`, `onchainDeliverToUnverified`, `onchainMarketsUnavailable`, `onchainMarketCatalogUnreadable`, `onchainMarketChainRequired`, `onchainMarketVariantRequired`, `onchainMarketTokenRequired`, `onchainSiteChainUnreadable`, `onchainWalletChainUnreadable`, `onchainWalletInactive`, `onchainWalletNotLinked`, `onchainWalletNotUsable`, `onchainWalletPickAmbiguous`, `onchainWalletWrongNetwork`, `signerLacksRight`, `signerUnavailable`, `signingGrantAmbiguous`, `signingGrantExpired`, `signingGrantRequired`, `signingGrantTokenNotKept`, `signingGrantTokenNotPayable`, `solverChainUnready`, `walletChainMismatch`, `walletNotUsableByYou`, `walletNotVerifiedForAce`, `walletNotWhitelisted`, `withdrawalChainUnsupported`, `accountFeeUnavailable`, `comparisonCostsUnavailable`, `connectionListingUnavailable`, `feeUnverified`, `noPool`, `noPrice`, `noSize`, `notFilled`, `notYetPublished`, `priceArithmetic`, `priceSourceNone`, `referenceMidUnavailable`, `settlementPrecisionUnavailable`, `accountSetupIncomplete`, `admissionUnavailable`, `advancedAccountEligibilityUnavailable`, `advancedAccountStateInconsistent`, `advancedConnectionDisabled`, `advancedConnectionNotConfigured`, `advancedConnectionPaused`, `advancedSettlementNeedsVerification`, `advancedModeDisabled`, `advancedNotAvailableForAccount`, `advancedNotEnabledForAccount`, `allowanceUnavailable`, `acrossCapacityExceeded`, `relayCapacityExceeded`, `acrossChainNotCarried`, `cctpChainNotCarried`, `relayChainNotCarried`, `apiKeyAdvancedWalletUnsupported`, `apiKeyOrganisationWalletScopeRequired`, `grantCapExceeded`, `amountAboveMaximum`, `amountBelowMinimum`, `amountUnreadable`, `amountsUnreadable`, `askFirst`, `authorityUnavailable`, `automationNeverAsks`, `availabilityUnreadable`, `backgroundNeverAsks`, `balanceUnreadable`, `defaultsUnavailable`, `walletHasNoAddress`, `walletUnavailable`, `bondAmountUnreadable`, `bondAssetUnreadable`, `catalogueUnavailable`, `chainFamilyUnknown`, `chainUnrecorded`, `clientSessionRequired`, `clockUnreadable`, `comingSoon`, `connectionChanged`, `connectionRevoked`, `corridorInvalid`, `credential`, `deadlineExceeded`, `defaultsLoading`, `deliverToCalldataUnsupported`, `deliverToTagUnsupported`, `deliverToNotPermitted`, `deliverToUnreadable`, `tradingPermissionRequired`, `directPatienceHarvest`, `economicallyInferior`, `exactAmountConflictsWithCard`, `exactAmountConflictsWithQuote`, `exactOutputDeliveryUnsupported`, `exactOutputEstimateUnavailable`, `exactRouteHypothesisUnavailable`, `expiredOnArrival`, `expiryUnknown`, `feeUnreadable`, `filteredOut`, `firmAskRefused`, `freshnessUnknown`, `fundingWindow`, `insufficientLiquidity`, `venueRelationship`, `venueRelationshipUnavailable`, `lpUnknown`, `mfaEnrolmentRequired`, `mfaRequired`, `minimumUnverified`, `mixedNetworks`, `netReceivedUnavailable`, `networkUnrecorded`, `noAddress`, `noCard`, `noFetcher`, `noInventory`, `noLaneForPair`, `noLegs`, `noOnChainCorridor`, `noPlannedVenue`, `noQuote`, `noRpc`, `notConnected`, `notEligible`, `notExecutable`, `orderPayloadMissing`, `outsideTopComposites`, `pairUnmapped`, `sellChainInvalid`, `permissionsUnreadable`, `placeOrderNotPermitted`, `prefundingMarkerUnreadable`, `prefundingRequired`, `indicative`, `priceOnRequest`, `priceOutOfRange`, `priceProtectionInvalid`, `pricingBookOnly`, `productNotQuoted`, `protocolChainMissing`, `providerFeeTreatmentUnknown`, `providerSiteUnrecorded`, `quoteIdUnissuable`, `quoteNotHeld`, `buyChainInvalid`, `buyAmountUnsupported`, `exactOutputDebitUnavailable`, `pairNotServed`, `receiveWalletNotServed`, `referenceMidUnreadable`, `referencePriceUnavailable`, `registryUnavailable`, `releaseRecheckUnavailable`, `requestUnbuildable`, `routeLegChainUnknown`, `routeLegUnnamed`, `routeLegUnplanned`, `routeUnavailable`, `secondFactorUnreadable`, `shortfallUnmeasured`, `shortfallUnreadable`, `singleChainVenue`, `siteChainUnreadable`, `sizeNotEligible`, `submitOrderBlocked`, `takerOnboardingIncomplete`, `tierNotQuoted`, `tradePaused`, `unsupportedNative`, `venueConnectionStorageUnavailable`, `venueDataStale`, `venueDeclined`, `venueNotConnected`, `venueNotEnabledForWorkspace`, `venueNotListed`, `venueTradeKeyUnavailable`, `venueTradeScopeRequired`, `venueTradeUnreadable`, `venueUnavailable`, `walletRefused`, `withdrawalFeeUnread`, `acrossRoutedViaCctp`, `apiKeyOrganisationWalletNotAllowlisted`, `balanceAvailabilityUnconfirmed`, `bankDestinationUnavailable`, `bebopJamKeyNotEnabled`, `bebopJamQuoteDeclined`, `bebopTokenUnavailable`, `relayCurrencyUnsupported`, `relaySwapImpactTooHigh`, `tetrafiSolverCallbackNotAuthorized`, `tradingLinkSnapshotChanged`, `tradingLinkSnapshotUnavailable`, `uniswapChainReadUnavailable`, `uniswapInsufficientDepth`, `uniswapQuoteUnreadable`, `uniswapUnwrapAboveDailyCap`, `uniswapUnwrapAboveTradeCap`, `uniswapRouteNotGranted`, `venueNotEnabled`, `askLimitReached`, `balanceMeaningUnconfirmed`, `bebopJamWalletUnsupported`, `bebopQuorumWalletTooSlow`, `bebopWalletQuorumUnreadable`, `connectionNotConfigured`, `deliveryAccountNetworkUnavailable`, `deliveryAccountUnavailable`, `destinationCannotSendOnChain`, `dexReferencePriceUnavailable`, `firmQuoteLimited`, `fundingAccountNetworkUnavailable`, `fundingAccountUnavailable`, `insufficientDepth`, `missingPermission`, `needsNativeGas`, `needsWallet`, `notPriced`, `payInTermsUnavailable`, `pilotTradeCapExceeded`, `platformFeeRateUnavailable`, `pricingBookPairUnserved`, `settlementDeclarationUnavailable`, `settlementNotAvailable`, `timedOut`, `timedOutBeforeSend`, `tradingSourceNetworkUnavailable`, `tradingSourceNotLinked`, `venueEnablementRechecking`, `venueEnablementUnavailable`, `venueListingTimedOut`, `venuePoliciesUnavailable`.\n\nNew values may be added; treat unknown values as other.", "type": "string" }, "sizeLimits": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/VenueRfqSizeObservation" } ] }, "status": { "description": "New values may be added; treat unknown values as other.", "enum": [ "unavailable" ], "type": "string", "x-extensible-enum": true }, "venue": { "$ref": "#/components/schemas/QuoteVenue" } }, "required": [ "asked", "detail", "reason", "status", "venue" ], "type": "object" } ], "x-extensible-enum": true }, "QuoteSourceFix": { "description": "The server-owned next step for a blocked source. It describes recovery, never grants authority.\nUnknown causes carry `none`; unknown amounts, approvers and existing requests are never invented.\n\nNew values may be added; treat unknown values as other.", "discriminator": { "propertyName": "kind" }, "oneOf": [ { "description": "Ask for the permission or wallet right `target`. For a member session it is offered only\nwhen the permission-request owner would open (or already holds) a request on it; a target\nit refuses by name (`blocked`, `not_applicable`, ...) reads `none`. When that read fails,\nthe step is offered unchanged.", "properties": { "action": { "type": [ "string", "null" ] }, "existingRequest": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/QuoteFixExistingRequest", "description": "The calling member's own pending request for this same target (the target key\nthe create route deduplicates on, so a request made from another venue's card\ncounts), read once per auction: the member already asked, so a client shows that\ninstead of offering a second request. Absent when there is none, when the read\nfailed or timed out (never a guessed value), and always for API keys and\nautomation principals: only a member session's quotes carry it." } ] }, "kind": { "description": "New values may be added; treat unknown values as other.", "enum": [ "requestPermission" ], "type": "string", "x-extensible-enum": true }, "target": { "$ref": "#/components/schemas/PermissionRequestTarget" } }, "required": [ "target", "kind" ], "type": "object" }, { "description": "Fund `target`. `amount` is the measured shortfall; it is absent when the shortfall is\nunknown (a venue that declined for insufficient balance does not say by how much), and the\nstep is offered all the same.", "properties": { "amount": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/DecimalAmount" } ] }, "kind": { "description": "New values may be added; treat unknown values as other.", "enum": [ "topUp" ], "type": "string", "x-extensible-enum": true }, "target": { "$ref": "#/components/schemas/QuoteFixFundingTarget" } }, "required": [ "target", "kind" ], "type": "object" }, { "properties": { "kind": { "description": "New values may be added; treat unknown values as other.", "enum": [ "switchWallet" ], "type": "string", "x-extensible-enum": true } }, "required": [ "kind" ], "type": "object" }, { "description": "Link a personal wallet that pays on `chain`: an Advanced card trades only from the member's\nown wallet, and none is linked there.", "properties": { "chain": { "$ref": "#/components/schemas/Caip2Chain" }, "kind": { "description": "New values may be added; treat unknown values as other.", "enum": [ "linkWallet" ], "type": "string", "x-extensible-enum": true } }, "required": [ "chain", "kind" ], "type": "object" }, { "properties": { "amount": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/DecimalAmount" } ] }, "kind": { "description": "New values may be added; treat unknown values as other.", "enum": [ "changeAmount" ], "type": "string", "x-extensible-enum": true } }, "required": [ "kind" ], "type": "object" }, { "properties": { "kind": { "description": "New values may be added; treat unknown values as other.", "enum": [ "enableVenue" ], "type": "string", "x-extensible-enum": true }, "target": { "$ref": "#/components/schemas/QuoteFixVenueTarget" }, "who": { "$ref": "#/components/schemas/WorkspacePermission" } }, "required": [ "target", "who", "kind" ], "type": "object" }, { "description": "Take `step` on the workspace's existing account at `target`: the venue is not asked until\na member with `who` takes it there.", "properties": { "kind": { "description": "New values may be added; treat unknown values as other.", "enum": [ "manageVenueAccount" ], "type": "string", "x-extensible-enum": true }, "step": { "$ref": "#/components/schemas/VenueAccountStep" }, "target": { "$ref": "#/components/schemas/QuoteFixVenueTarget" }, "who": { "$ref": "#/components/schemas/WorkspacePermission" } }, "required": [ "target", "step", "who", "kind" ], "type": "object" }, { "description": "Within the account's credit limit but short of available credit: an order of at most\n`maxAmount` `asset` (the debit asset; exact, rounded down) passes the same check.", "properties": { "asset": { "type": "string" }, "kind": { "description": "New values may be added; treat unknown values as other.", "enum": [ "reduceAmount" ], "type": "string", "x-extensible-enum": true }, "maxAmount": { "$ref": "#/components/schemas/DecimalAmount" } }, "required": [ "maxAmount", "asset", "kind" ], "type": "object" }, { "description": "Already over the account's credit limit: no smaller amount passes, only a trade that\nreduces what the account owes. Review the venue account's positions.", "properties": { "kind": { "description": "New values may be added; treat unknown values as other.", "enum": [ "reviewPositions" ], "type": "string", "x-extensible-enum": true }, "venueAccountId": { "format": "uuid", "type": "string" } }, "required": [ "venueAccountId", "kind" ], "type": "object" }, { "description": "A credit trade settles in the venue account's settlement window, and that account's\nschedule cannot produce one yet (a term the LP has not confirmed). Review the account's\nsettlement schedule and its pending request, where the LP's answer is recorded.", "properties": { "kind": { "description": "New values may be added; treat unknown values as other.", "enum": [ "reviewSettlementSchedule" ], "type": "string", "x-extensible-enum": true }, "venueAccountId": { "format": "uuid", "type": "string" } }, "required": [ "venueAccountId", "kind" ], "type": "object" }, { "description": "The account's credit figures could not be read (or are too old) to decide this trade:\nask the quote again to read them afresh. `lastGoodReadAt` is the last good read, if any.", "properties": { "kind": { "description": "New values may be added; treat unknown values as other.", "enum": [ "refreshCredit" ], "type": "string", "x-extensible-enum": true }, "lastGoodReadAt": { "format": "date-time", "type": [ "string", "null" ] } }, "required": [ "kind" ], "type": "object" }, { "properties": { "kind": { "description": "New values may be added; treat unknown values as other.", "enum": [ "finishOnboarding" ], "type": "string", "x-extensible-enum": true } }, "required": [ "kind" ], "type": "object" }, { "properties": { "kind": { "description": "New values may be added; treat unknown values as other.", "enum": [ "waitUntil" ], "type": "string", "x-extensible-enum": true }, "until": { "format": "date-time", "type": "string" } }, "required": [ "until", "kind" ], "type": "object" }, { "description": "Set up wallet infrastructure (Integrations › Wallet infrastructure): the workspace's\nwallet infrastructure, which hosts governed organisation wallets as well as embedded\nones, is not set up or is turned off, so no trading grant can be prepared until it is.", "properties": { "kind": { "description": "New values may be added; treat unknown values as other.", "enum": [ "setUpEmbeddedWallets" ], "type": "string", "x-extensible-enum": true } }, "required": [ "kind" ], "type": "object" }, { "properties": { "kind": { "description": "New values may be added; treat unknown values as other.", "enum": [ "none" ], "type": "string", "x-extensible-enum": true } }, "required": [ "kind" ], "type": "object" } ], "x-extensible-enum": true }, "QuoteTradingSourceRefusal": { "description": "Why a priced card has no executable source, with the native in-page recovery action.", "properties": { "code": { "type": "string" }, "detail": { "description": "Human-readable recovery, including key re-issuance or a wallet grant.", "type": [ "string", "null" ] }, "fix": { "$ref": "#/components/schemas/QuoteSourceFix" }, "venueId": { "type": "string" } }, "required": [ "code", "venueId", "fix" ], "type": "object" }, "QuoteVenue": { "description": "The venue block. A protocol version is part of the venue's identity. `id` is\nthe registry's venue id, the same one `/prices` rows and `sources[]` carry.", "properties": { "id": { "type": "string" }, "integrationMode": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/IntegrationMode", "description": "The integration mode this venue was reached through:\nBasic (`basic`) or Advanced (`advanced`), the committed\n`IntegrationMode` wire values. Absent where no mode applies (a price row). Staged: read\nfirst, then written, so a venue reached in both modes keeps two outcomes." } ] }, "logoUrl": { "description": "The venue's logo: always sent; the logo the venue's LP uploaded\nto its workspace (`/api/v1/brand/logos/.webp`), else `null`, when the UI\nshows its preset or generated mark. Never synthesised from the venue id or name.", "type": [ "string", "null" ] }, "modality": { "$ref": "#/components/schemas/VenueModality" }, "name": { "type": "string" }, "protocolVersion": { "type": [ "string", "null" ] }, "venueId": { "description": "The catalogue Venue, distinct from this route's registry/execution id.\nAbsent for routes no Venue declares (DEX pools and registered solvers).", "type": [ "string", "null" ] }, "venueName": { "description": "The catalogue Venue's display name, present exactly when `venue_id` is present.", "type": [ "string", "null" ] } }, "required": [ "id", "logoUrl", "modality", "name", "protocolVersion" ], "type": "object" }, "QuoteWalletSelection": { "description": "One chain's selected wallet and the venue account whose selection it is.", "properties": { "connectionId": { "type": "string" }, "displacedPreference": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/BindingTargetView", "description": "A known eligible preference that this account did not link. Display only." } ] }, "reason": { "$ref": "#/components/schemas/QuoteWalletSelectionReason" }, "venueId": { "type": "string" }, "venueName": { "type": "string" }, "walletId": { "type": "string" } }, "required": [ "walletId", "reason", "connectionId", "venueId", "venueName" ], "type": "object" }, "QuoteWalletSelectionReason": { "description": "The origin of a bound Basic wallet, not a signing or permission grant.\n\nNew values may be added; treat unknown values as other.", "enum": [ "accountDefault", "preference", "explicit" ], "type": "string", "x-extensible-enum": true }, "QuotedSettlement": { "allOf": [ { "$ref": "#/components/schemas/SettlementTerms" }, { "properties": { "window": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/SettlementWindowTerms" } ] } }, "type": "object" } ], "description": "A quote's, firm answer's and executed trade's settlement: the venue's declared terms and,\nfor delayed timing only, the window. `{method, firstLeg?, timing, window?}` on the wire." }, "QuotesRequestBody": { "description": "The `POST /quotes` request body, told apart by shape: a top-level `requote` is a\nRequote; any other object is a pair request (the legacy intent body is retired).", "oneOf": [ { "$ref": "#/components/schemas/PairQuoteRequest" }, { "$ref": "#/components/schemas/RequoteRequest" } ] }, "QuotesResponseBody": { "description": "`POST /quotes` 200 body: the quote set. Schema only.", "oneOf": [ { "$ref": "#/components/schemas/PairQuoteSet" } ] }, "RateLimitsView": { "properties": { "burstSize": { "format": "int32", "minimum": 0, "type": "integer" }, "requestsPerMinute": { "format": "int32", "minimum": 0, "type": "integer" } }, "required": [ "requestsPerMinute", "burstSize" ], "type": "object" }, "Readiness": { "description": "Whether the quote can be ordered now. Unknown is `unavailable`,\nnever a value.\n\nNew values may be added; treat unknown values as other.", "discriminator": { "propertyName": "kind" }, "oneOf": [ { "properties": { "kind": { "description": "New values may be added; treat unknown values as other.", "enum": [ "ready" ], "type": "string", "x-extensible-enum": true } }, "required": [ "kind" ], "type": "object" }, { "description": "The venue account holds enough.", "properties": { "kind": { "description": "New values may be added; treat unknown values as other.", "enum": [ "funded" ], "type": "string", "x-extensible-enum": true } }, "required": [ "kind" ], "type": "object" }, { "properties": { "amount": { "$ref": "#/components/schemas/DecimalAmount" }, "how": { "$ref": "#/components/schemas/FundingMethod" }, "kind": { "description": "New values may be added; treat unknown values as other.", "enum": [ "shortfall" ], "type": "string", "x-extensible-enum": true } }, "required": [ "amount", "how", "kind" ], "type": "object" }, { "properties": { "family": { "$ref": "#/components/schemas/ChainFamily" }, "kind": { "description": "New values may be added; treat unknown values as other.", "enum": [ "needsWallet" ], "type": "string", "x-extensible-enum": true } }, "required": [ "family", "kind" ], "type": "object" }, { "description": "The taker sends a transaction itself and needs `amount` of `asset`, the chain's\nnative gas Asset in the registry.", "properties": { "amount": { "$ref": "#/components/schemas/DecimalAmount" }, "asset": { "$ref": "#/components/schemas/AssetId" }, "chain": { "$ref": "#/components/schemas/Caip2Chain" }, "kind": { "description": "New values may be added; treat unknown values as other.", "enum": [ "needsNativeGas" ], "type": "string", "x-extensible-enum": true } }, "required": [ "chain", "amount", "asset", "kind" ], "type": "object" }, { "properties": { "kind": { "description": "New values may be added; treat unknown values as other.", "enum": [ "unavailable" ], "type": "string", "x-extensible-enum": true }, "reason": { "description": "Known source reason tokens (not all apply to every status): `adapterPayloadSerializationFailed`, `basicVenueAccountsUnavailable`, `billingPaymentOverdue`, `walletNotOnChain`, `ccxtVenueRequiresCexLane`, `executionStageDisabled`, `jurisdictionUnproven`, `onboardedVenuesUnavailable`, `onchainAccountDefaultWalletRequired`, `onchainAccountDefaultWalletUnavailable`, `onchainAccountWalletRequired`, `onchainAssetDecimalsMismatch`, `onchainAssetIdentityMismatch`, `onchainAssetUnmapped`, `onchainAssetVariantFiltered`, `onchainWalletUnavailable`, `onchainCatalogueUnavailable`, `onchainDeliverToNotReceivingWallet`, `onchainDeliverToUnverified`, `onchainMarketsUnavailable`, `onchainMarketCatalogUnreadable`, `onchainMarketChainRequired`, `onchainMarketVariantRequired`, `onchainMarketTokenRequired`, `onchainSiteChainUnreadable`, `onchainWalletChainUnreadable`, `onchainWalletInactive`, `onchainWalletNotLinked`, `onchainWalletNotUsable`, `onchainWalletPickAmbiguous`, `onchainWalletWrongNetwork`, `signerLacksRight`, `signerUnavailable`, `signingGrantAmbiguous`, `signingGrantExpired`, `signingGrantRequired`, `signingGrantTokenNotKept`, `signingGrantTokenNotPayable`, `solverChainUnready`, `walletChainMismatch`, `walletNotUsableByYou`, `walletNotVerifiedForAce`, `walletNotWhitelisted`, `withdrawalChainUnsupported`, `accountFeeUnavailable`, `comparisonCostsUnavailable`, `connectionListingUnavailable`, `feeUnverified`, `noPool`, `noPrice`, `noSize`, `notFilled`, `notYetPublished`, `priceArithmetic`, `priceSourceNone`, `referenceMidUnavailable`, `settlementPrecisionUnavailable`, `accountSetupIncomplete`, `admissionUnavailable`, `advancedAccountEligibilityUnavailable`, `advancedAccountStateInconsistent`, `advancedConnectionDisabled`, `advancedConnectionNotConfigured`, `advancedConnectionPaused`, `advancedSettlementNeedsVerification`, `advancedModeDisabled`, `advancedNotAvailableForAccount`, `advancedNotEnabledForAccount`, `allowanceUnavailable`, `acrossCapacityExceeded`, `relayCapacityExceeded`, `acrossChainNotCarried`, `cctpChainNotCarried`, `relayChainNotCarried`, `apiKeyAdvancedWalletUnsupported`, `apiKeyOrganisationWalletScopeRequired`, `grantCapExceeded`, `amountAboveMaximum`, `amountBelowMinimum`, `amountUnreadable`, `amountsUnreadable`, `askFirst`, `authorityUnavailable`, `automationNeverAsks`, `availabilityUnreadable`, `backgroundNeverAsks`, `balanceUnreadable`, `defaultsUnavailable`, `walletHasNoAddress`, `walletUnavailable`, `bondAmountUnreadable`, `bondAssetUnreadable`, `catalogueUnavailable`, `chainFamilyUnknown`, `chainUnrecorded`, `clientSessionRequired`, `clockUnreadable`, `comingSoon`, `connectionChanged`, `connectionRevoked`, `corridorInvalid`, `credential`, `deadlineExceeded`, `defaultsLoading`, `deliverToCalldataUnsupported`, `deliverToTagUnsupported`, `deliverToNotPermitted`, `deliverToUnreadable`, `tradingPermissionRequired`, `directPatienceHarvest`, `economicallyInferior`, `exactAmountConflictsWithCard`, `exactAmountConflictsWithQuote`, `exactOutputDeliveryUnsupported`, `exactOutputEstimateUnavailable`, `exactRouteHypothesisUnavailable`, `expiredOnArrival`, `expiryUnknown`, `feeUnreadable`, `filteredOut`, `firmAskRefused`, `freshnessUnknown`, `fundingWindow`, `insufficientLiquidity`, `venueRelationship`, `venueRelationshipUnavailable`, `lpUnknown`, `mfaEnrolmentRequired`, `mfaRequired`, `minimumUnverified`, `mixedNetworks`, `netReceivedUnavailable`, `networkUnrecorded`, `noAddress`, `noCard`, `noFetcher`, `noInventory`, `noLaneForPair`, `noLegs`, `noOnChainCorridor`, `noPlannedVenue`, `noQuote`, `noRpc`, `notConnected`, `notEligible`, `notExecutable`, `orderPayloadMissing`, `outsideTopComposites`, `pairUnmapped`, `sellChainInvalid`, `permissionsUnreadable`, `placeOrderNotPermitted`, `prefundingMarkerUnreadable`, `prefundingRequired`, `indicative`, `priceOnRequest`, `priceOutOfRange`, `priceProtectionInvalid`, `pricingBookOnly`, `productNotQuoted`, `protocolChainMissing`, `providerFeeTreatmentUnknown`, `providerSiteUnrecorded`, `quoteIdUnissuable`, `quoteNotHeld`, `buyChainInvalid`, `buyAmountUnsupported`, `exactOutputDebitUnavailable`, `pairNotServed`, `receiveWalletNotServed`, `referenceMidUnreadable`, `referencePriceUnavailable`, `registryUnavailable`, `releaseRecheckUnavailable`, `requestUnbuildable`, `routeLegChainUnknown`, `routeLegUnnamed`, `routeLegUnplanned`, `routeUnavailable`, `secondFactorUnreadable`, `shortfallUnmeasured`, `shortfallUnreadable`, `singleChainVenue`, `siteChainUnreadable`, `sizeNotEligible`, `submitOrderBlocked`, `takerOnboardingIncomplete`, `tierNotQuoted`, `tradePaused`, `unsupportedNative`, `venueConnectionStorageUnavailable`, `venueDataStale`, `venueDeclined`, `venueNotConnected`, `venueNotEnabledForWorkspace`, `venueNotListed`, `venueTradeKeyUnavailable`, `venueTradeScopeRequired`, `venueTradeUnreadable`, `venueUnavailable`, `walletRefused`, `withdrawalFeeUnread`, `acrossRoutedViaCctp`, `apiKeyOrganisationWalletNotAllowlisted`, `balanceAvailabilityUnconfirmed`, `bankDestinationUnavailable`, `bebopJamKeyNotEnabled`, `bebopJamQuoteDeclined`, `bebopTokenUnavailable`, `relayCurrencyUnsupported`, `relaySwapImpactTooHigh`, `tetrafiSolverCallbackNotAuthorized`, `tradingLinkSnapshotChanged`, `tradingLinkSnapshotUnavailable`, `uniswapChainReadUnavailable`, `uniswapInsufficientDepth`, `uniswapQuoteUnreadable`, `uniswapUnwrapAboveDailyCap`, `uniswapUnwrapAboveTradeCap`, `uniswapRouteNotGranted`, `venueNotEnabled`, `askLimitReached`, `balanceMeaningUnconfirmed`, `bebopJamWalletUnsupported`, `bebopQuorumWalletTooSlow`, `bebopWalletQuorumUnreadable`, `connectionNotConfigured`, `deliveryAccountNetworkUnavailable`, `deliveryAccountUnavailable`, `destinationCannotSendOnChain`, `dexReferencePriceUnavailable`, `firmQuoteLimited`, `fundingAccountNetworkUnavailable`, `fundingAccountUnavailable`, `insufficientDepth`, `missingPermission`, `needsNativeGas`, `needsWallet`, `notPriced`, `payInTermsUnavailable`, `pilotTradeCapExceeded`, `platformFeeRateUnavailable`, `pricingBookPairUnserved`, `settlementDeclarationUnavailable`, `settlementNotAvailable`, `timedOut`, `timedOutBeforeSend`, `tradingSourceNetworkUnavailable`, `tradingSourceNotLinked`, `venueEnablementRechecking`, `venueEnablementUnavailable`, `venueListingTimedOut`, `venuePoliciesUnavailable`.\n\nNew values may be added; treat unknown values as other.", "type": "string" } }, "required": [ "reason", "kind" ], "type": "object" } ], "x-extensible-enum": true }, "RecordedRiskTradeScope": { "description": "The recorded business population and original rolling Risk window.\n`asOf` keeps the source's RFC 3339 text, including microsecond precision.\nIt does not record which trades were in the population at that time.", "properties": { "asOf": { "type": "string" }, "counterparty": { "type": "string" }, "windowSeconds": { "format": "int64", "type": "integer" } }, "required": [ "counterparty", "asOf", "windowSeconds" ], "type": "object" }, "ReferenceMid": { "description": "The Reference USD price of the request's two assets, and the mid they imply.", "properties": { "buyPerSell": { "description": "Buy-asset units per one sell-asset unit (`sellUsd / buyUsd`).", "type": "string" }, "buyUsd": { "description": "USD per one unit of the buy asset.", "type": "string" }, "sellUsd": { "description": "USD per one unit of the sell asset.", "type": "string" } }, "required": [ "sellUsd", "buyUsd", "buyPerSell" ], "type": "object" }, "RenewalReason": { "description": "Why a KYB review was opened: the initial review, an expiry, an operator request or a compliance review.\n\nNew values may be added; treat unknown values as other.", "enum": [ "expiry", "operator_requested", "compliance_review", "initial" ], "type": "string", "x-extensible-enum": true }, "ReportingConnectionStatus": { "description": "New values may be added; treat unknown values as other.", "enum": [ "connected", "notConnected", "unavailable", "unknown" ], "type": "string", "x-extensible-enum": true }, "ReportingCoverage": { "description": "Advisory connection coverage. Never an order-admission decision.", "properties": { "legs": { "items": { "$ref": "#/components/schemas/ReportingLegCoverage" }, "type": "array" }, "transfers": { "items": { "$ref": "#/components/schemas/ReportingTransfer" }, "type": "array" } }, "required": [ "legs" ], "type": "object" }, "ReportingInstitutionCoverage": { "properties": { "name": { "type": "string" }, "status": { "$ref": "#/components/schemas/ReportingConnectionStatus" }, "workspaceId": { "type": [ "string", "null" ] } }, "required": [ "name", "status" ], "type": "object" }, "ReportingLegCoverage": { "properties": { "counterparty": { "$ref": "#/components/schemas/ReportingInstitutionCoverage" }, "legId": { "type": "string" }, "limitation": { "type": [ "string", "null" ] }, "provider": { "type": "string" }, "reportingInstitution": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/ReportingInstitutionCoverage", "description": "Customer companies do not need a separate reporting connection." } ] } }, "required": [ "legId", "provider", "counterparty" ], "type": "object" }, "ReportingTransfer": { "properties": { "createdAt": { "format": "date-time", "type": "string" }, "dataStatus": { "type": "string" }, "escalatedAt": { "format": "date-time", "type": [ "string", "null" ] }, "id": { "type": "string" }, "lastError": { "type": [ "string", "null" ] }, "nextRetryAt": { "format": "date-time", "type": [ "string", "null" ] }, "orderId": { "type": "string" }, "piiSubmittedAt": { "format": "date-time", "type": [ "string", "null" ] }, "providerCheckedAt": { "format": "date-time", "type": [ "string", "null" ] }, "providerStatus": { "type": [ "string", "null" ] }, "providerTransferId": { "type": [ "string", "null" ] }, "receivingVaspDid": { "type": [ "string", "null" ] }, "reportingWorkspaceId": { "type": [ "string", "null" ] }, "sendingVaspDid": { "type": [ "string", "null" ] }, "state": { "description": "The record's classification, the same one the daily summary counts:\n`pending | acknowledged | settled | recorded | attention | not_reported`.", "type": "string" }, "transmissionStatus": { "type": "string" }, "viewerRole": { "description": "This workspace's part in the record, first match:\n`reporting | lp | counterparty | taker`; the order read may say `unknown`.", "type": "string" } }, "required": [ "state", "viewerRole", "id", "orderId", "transmissionStatus", "dataStatus", "createdAt" ], "type": "object" }, "RepricedSide": { "description": "Which side of a leg a re-price compares. A StableFX leg re-quotes to the exact output\nand bounds the INPUT it spends; RFQ and solver legs bound the OUTPUT they deliver.\n\nNew values may be added; treat unknown values as other.", "enum": [ "input", "output" ], "type": "string", "x-extensible-enum": true }, "RequoteNeed": { "description": "A Binding slot a requote needs filled. An empty `needs` means requote as is.\n\nNew values may be added; treat unknown values as other.", "enum": [ "wallet:evm", "wallet:solana", "wallet:tron", "account", "bankAccount", "deliverTo" ], "type": "string", "x-extensible-enum": true }, "RequoteRequest": { "additionalProperties": false, "description": "Asks the venue of an earlier quote again. Only these fields.\n\nOnly that quote's venue (every venue of a multi-leg route) is asked, for the same pair, amount and side,\nand the answer is one new held quote with `requoteOf`; the original stays orderable until its own expiry.\nA venue's indicative card gets its firm quote this way (every such venue, including one whose\nfirm quote lives 5 s or less and whose card offers Execute within your limit, `next: order`), like naming\nthe venue in `filters.venues.include`, under the same desk ask limits. Refusals, each by name: 404\n`QUOTE_NOT_FOUND` (unknown or another principal's), 410 `QUOTE_EXPIRED` (over 10 minutes past expiry),\n400 `CORRIDOR_NOT_OFFERED`, 403 `SOURCE_NOT_OWNED`,\n409 `PERSONAL_TARGET_NOT_ALLOWED` (an API key naming a personal wallet), 400 `WALLET_NOT_ON_CHAIN`,\n403 `ACCOUNT_NOT_AVAILABLE`, 403 `VENUE_NOT_AVAILABLE_TO_CREDENTIAL`, 409 `REQUOTE_REFUSED` (the venue's\nreason in `message`, its token in `details.reason`), 409 `REQUOTE_NEEDS_WALLET`, 504 `REQUOTE_TIMED_OUT`,\n429 `QUOTE_RATE_LIMITED` / `VENUE_FIRM_QUOTE_LIMITED` / `BUDGET_EXHAUSTED` with `Retry-After`.", "properties": { "corridor": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/QuoteCorridor", "description": "Another corridor the original card offered (`corridors[]`, or its own)." } ] }, "deliverTo": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/DeliverTo" } ] }, "priceProtectionBps": { "description": "The price protection for the new quote's `minOut`; absent keeps the original's.", "format": "int32", "minimum": 0, "type": [ "integer", "null" ] }, "requote": { "description": "The quote id to requote (`q_…`, from an earlier `POST /quotes`).", "type": "string" }, "source": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/SourceSelection", "description": "A different wallet (one of the card's `bindingOptions`), venue account or delivery for the new\nquote; absent keeps the original's binding, re-keyed to the new corridor when one is given." } ] } }, "required": [ "requote" ], "type": "object" }, "ResolvedDeliverTo": { "description": "A resolved destination includes observed presentation facts, unlike a request.\n\nNew values may be added; treat unknown values as other.", "oneOf": [ { "properties": { "accountKind": { "$ref": "#/components/schemas/FundingAccountKind" }, "displayName": { "type": "string" }, "financialAccountId": { "type": "string" }, "isDefault": { "type": "boolean" }, "kind": { "description": "New values may be added; treat unknown values as other.", "enum": [ "financialAccount" ], "type": "string", "x-extensible-enum": true }, "network": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/Caip2Chain" } ] } }, "required": [ "financialAccountId", "accountKind", "displayName", "isDefault", "kind" ], "type": "object" }, { "properties": { "address": { "type": "string" }, "calldata": { "type": [ "string", "null" ] }, "chain": { "$ref": "#/components/schemas/Caip2Chain" }, "destinationTag": { "type": [ "string", "null" ] }, "kind": { "description": "New values may be added; treat unknown values as other.", "enum": [ "address" ], "type": "string", "x-extensible-enum": true } }, "required": [ "chain", "address", "kind" ], "type": "object" } ], "x-extensible-enum": true }, "ResolvedTradingSource": { "description": "An indivisible quote/order source block. Its funding and settlement are venue-owned.", "properties": { "creditCheck": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/CreditCheck", "description": "The credit decision the funding was derived from: point-in-time evidence, never a\nreservation or dispatch authority. Present exactly when `creditPortion` is." } ] }, "creditPortion": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/CreditAmount", "description": "A `credit` trade's exact credit portion: the part of the debit, in the debit asset, that\ncreates or increases a negative position (the rest is spent from positives). Present\nexactly when `fundingModel` is `credit`." } ] }, "creditReservation": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/CreditReservation", "description": "The firm ask's combined cash and credit hold on a credit venue account, held\nuntil the quote expires or its order adopts it. Absent on indicative cards." } ] }, "deliverTo": { "$ref": "#/components/schemas/ResolvedDeliverTo" }, "fundingAccount": { "$ref": "#/components/schemas/FundingAccount" }, "fundingModel": { "$ref": "#/components/schemas/FundingModel" }, "payIn": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/PayInTerms" } ] }, "settlement": { "$ref": "#/components/schemas/QuotedSettlement", "description": "The venue's declared terms and, for delayed timing, the account schedule's window." }, "tradingSource": { "$ref": "#/components/schemas/TradingSource" } }, "required": [ "tradingSource", "fundingModel", "settlement", "fundingAccount", "deliverTo" ], "type": "object" }, "RestrictedReason": { "description": "Why a gate kept a venue from a principal.\n\nNew values may be added; treat unknown values as other.", "enum": [ "mfaRequired", "venueTradeScopeRequired", "credential", "clientSessionRequired", "takerOnboardingIncomplete", "tradingPermissionRequired", "mfaEnrolmentRequired", "venueRelationship" ], "type": "string", "x-extensible-enum": true }, "RfqMechanism": { "description": "The mechanism that actually produced the quote, never a separate venue.", "properties": { "dealerQuotes": { "format": "int32", "minimum": 0, "type": [ "integer", "null" ] }, "kind": { "$ref": "#/components/schemas/RfqMechanismKind" }, "label": { "type": "string" }, "tag": { "type": "string" } }, "required": [ "tag", "kind", "label" ], "type": "object" }, "RfqMechanismAdvisory": { "description": "A mechanism's limitation remains visible when another mechanism serves it.", "properties": { "code": { "type": "string" }, "lpName": { "type": "string" }, "mechanism": { "type": "string" } }, "required": [ "code", "mechanism", "lpName" ], "type": "object" }, "RfqMechanismKind": { "description": "New values may be added; treat unknown values as other.", "enum": [ "standard", "large_orders", "block_trades" ], "type": "string", "x-extensible-enum": true }, "RotateSecretResponse": { "description": "Response after rotating a webhook secret: the new `whsec_` secret, shown once.\nThe previous key keeps signing for 24 hours: `webhook-signature` then contains two\nspace-separated `v1,` signatures. A Standard Webhooks verifier accepts either.", "properties": { "secret": { "description": "Present only on the first response; receipts and replays contain null.", "type": [ "string", "null" ] }, "secretShownOnce": { "description": "True even when the secret has been withheld on replay.", "type": "boolean" } }, "required": [ "secret", "secretShownOnce" ], "type": "object" }, "RoutingPath": { "description": "How an LP is available to a requesting workspace: `{\"type\": \"direct\"}`, or\n`{\"type\": \"via_broker\", \"brokerWorkspaceId\": \"...\", \"brokerName\": \"...\"}`.\n\nNew values may be added; treat unknown values as other.", "oneOf": [ { "description": "LP has a direct bilateral relationship with the requesting workspace.", "properties": { "type": { "description": "New values may be added; treat unknown values as other.", "enum": [ "direct" ], "type": "string", "x-extensible-enum": true } }, "required": [ "type" ], "type": "object" }, { "description": "LP available through an affiliated broker.", "properties": { "brokerName": { "type": "string" }, "brokerWorkspaceId": { "format": "uuid", "type": "string" }, "type": { "description": "New values may be added; treat unknown values as other.", "enum": [ "via_broker" ], "type": "string", "x-extensible-enum": true } }, "required": [ "brokerWorkspaceId", "brokerName", "type" ], "type": "object" } ], "x-extensible-enum": true }, "SanctionsScreeningState": { "description": "A name and jurisdiction screening state. Only clear is clear: unscreened (no verdict recorded) and pending (no current verdict, for example after a name change) both block value movement.\n\nNew values may be added; treat unknown values as other.", "enum": [ "unscreened", "pending", "clear", "flagged" ], "type": "string", "x-extensible-enum": true }, "ScreeningProviderKind": { "description": "The wallet-address screening provider this environment runs. unconfigured means none, and value-moving capabilities refuse with SCREENING_UNAVAILABLE.\n\nNew values may be added; treat unknown values as other.", "enum": [ "chainalysis", "sanctions_lists", "mock", "unconfigured" ], "type": "string", "x-extensible-enum": true }, "ScreeningReadiness": { "description": "The screening sources configured for this zone. Platform facts, not a\nsubject's verdict.", "properties": { "geoSource": { "$ref": "#/components/schemas/GeoSourceKind" }, "walletScreeningProvider": { "$ref": "#/components/schemas/ScreeningProviderKind" } }, "required": [ "walletScreeningProvider", "geoSource" ], "type": "object" }, "Settlement": { "description": "Settlement information for an order\n\nSettlement structure that remains consistent across protocol versions.", "properties": { "data": { "description": "Settlement-specific data" }, "type": { "$ref": "#/components/schemas/SettlementType", "description": "Settlement mechanism type" } }, "required": [ "type", "data" ], "type": "object" }, "SettlementCadence": { "description": "How often a settlement schedule's windows occur (the schedule owns the terms).\n\nNew values may be added; treat unknown values as other.", "oneOf": [ { "properties": { "dayBasis": { "$ref": "#/components/schemas/DayBasis" }, "everyHours": { "format": "int32", "minimum": 0, "type": [ "integer", "null" ] }, "kind": { "description": "New values may be added; treat unknown values as other.", "enum": [ "intraday" ], "type": "string", "x-extensible-enum": true }, "localTimes": { "items": { "type": "string" }, "type": [ "array", "null" ] } }, "required": [ "dayBasis", "kind" ], "type": "object" }, { "properties": { "dayBasis": { "$ref": "#/components/schemas/DayBasis" }, "days": { "format": "int32", "minimum": 0, "type": "integer" }, "kind": { "description": "New values may be added; treat unknown values as other.", "enum": [ "daily" ], "type": "string", "x-extensible-enum": true } }, "required": [ "days", "dayBasis", "kind" ], "type": "object" }, { "properties": { "dayBasis": { "$ref": "#/components/schemas/DayBasis" }, "days": { "format": "int32", "minimum": 0, "type": "integer" }, "kind": { "description": "New values may be added; treat unknown values as other.", "enum": [ "multiDay" ], "type": "string", "x-extensible-enum": true } }, "required": [ "days", "dayBasis", "kind" ], "type": "object" } ], "x-extensible-enum": true }, "SettlementGrace": { "description": "New values may be added; treat unknown values as other.", "oneOf": [ { "properties": { "kind": { "description": "New values may be added; treat unknown values as other.", "enum": [ "no_grace" ], "type": "string", "x-extensible-enum": true } }, "required": [ "kind" ], "type": "object" }, { "properties": { "kind": { "description": "New values may be added; treat unknown values as other.", "enum": [ "within" ], "type": "string", "x-extensible-enum": true }, "seconds": { "format": "int32", "minimum": 0, "type": "integer" } }, "required": [ "seconds", "kind" ], "type": "object" } ], "x-extensible-enum": true }, "SettlementMethod": { "description": "New values may be added; treat unknown values as other.", "oneOf": [ { "properties": { "method": { "description": "New values may be added; treat unknown values as other.", "enum": [ "venueLedger" ], "type": "string", "x-extensible-enum": true } }, "required": [ "method" ], "type": "object" }, { "properties": { "method": { "description": "New values may be added; treat unknown values as other.", "enum": [ "dvp" ], "type": "string", "x-extensible-enum": true } }, "required": [ "method" ], "type": "object" }, { "properties": { "firstLeg": { "$ref": "#/components/schemas/FirstLeg" }, "method": { "description": "New values may be added; treat unknown values as other.", "enum": [ "fop" ], "type": "string", "x-extensible-enum": true } }, "required": [ "firstLeg", "method" ], "type": "object" } ], "x-extensible-enum": true }, "SettlementTerms": { "allOf": [ { "$ref": "#/components/schemas/SettlementMethod" }, { "properties": { "timing": { "$ref": "#/components/schemas/SettlementTiming" } }, "required": [ "timing" ], "type": "object" } ], "description": "How and when the trade's assets move, as one flat set of fields." }, "SettlementTiming": { "description": "New values may be added; treat unknown values as other.", "enum": [ "immediate", "byDeadline", "delayed" ], "type": "string", "x-extensible-enum": true }, "SettlementType": { "description": "Settlement mechanism types\n\nCore settlement mechanisms that are stable across protocol versions.\n- `Escrow`: On-chain escrow-based atomic settlement (T+0).\n- `ResourceLock`: Resource lock-based atomic settlement (T+0).\n- `Deferred`: Off-chain bilateral settlement with LP settlement window (T+~8h).\n\nNew values may be added; treat unknown values as other.", "enum": [ "escrow", "resourceLock", "deferred" ], "type": "string", "x-extensible-enum": true }, "SettlementWindowTerms": { "description": "The account schedule's window a delayed trade settles in, fixed when the quote was\nmade and recorded unchanged on the executed trade. A `clock` window carries `settlesBy`,\nthe occurrence's confirmed completion; an `onAgreement` window (an LP-issued statement with\nno completion term) carries none. A window whose completion is pending on any other\nschedule is never emitted.", "properties": { "assumedBoundary": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/AssumedWindowBoundary", "description": "Present when the window's boundary comes from an assumed schedule term rather than the\nLP's confirmation: every surface shows the window as assumed until the LP confirms it." } ] }, "cadence": { "$ref": "#/components/schemas/SettlementCadence" }, "cutoffAt": { "format": "date-time", "type": [ "string", "null" ] }, "paymentDeadlineAt": { "description": "The occurrence's payment deadline from its schedule terms: what a credit trade's debt is\npaid by. Absent while the schedule has not confirmed it; never derived from `settlesBy`.", "format": "date-time", "type": [ "string", "null" ] }, "scheduleId": { "type": "string" }, "scheduleLabel": { "description": "The published schedule version's display name (e.g. \"EU\"), so a quote card or Review\nnames the window without a settlement read permission.", "type": "string" }, "scheduleVersion": { "format": "int64", "type": "integer" }, "settlementBasis": { "$ref": "#/components/schemas/WindowSettlementBasis" }, "settlesBy": { "format": "date-time", "type": [ "string", "null" ] }, "snapshotAt": { "format": "date-time", "type": "string" }, "statementIssuer": { "description": "The LP whose statement settles an `onAgreement` window (\"Keyrock\"); absent on a clock window.", "type": [ "string", "null" ] }, "windowId": { "format": "uuid", "type": "string" } }, "required": [ "windowId", "scheduleId", "scheduleVersion", "scheduleLabel", "cadence", "snapshotAt" ], "type": "object" }, "SizeFill": { "description": "How much of a size the source fills.\n\nNew values may be added; treat unknown values as other.", "enum": [ "full", "partial", "none" ], "type": "string", "x-extensible-enum": true }, "SolverStatus": { "description": "Solver operational status and conformance lifecycle.\n\nState machine:\n```text\nRegistered → Validating\nValidating → Active | Inactive\nActive → Validating | Paused | Disabled\nInactive → Validating | Disabled\nPaused → Validating | Disabled\nDisabled → ∅ (terminal; only a TetraFi administrator can re-enable it)\n```\n\nNew values may be added; treat unknown values as other.", "enum": [ "registered", "validating", "active", "inactive", "paused", "disabled" ], "type": "string", "x-extensible-enum": true }, "SourceCandidate": { "properties": { "address": { "description": "A wallet's own address, so a page names exactly which wallet pays (the old\nbinding candidate carried it); absent for accounts and unread addresses.", "type": [ "string", "null" ] }, "balance": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/CandidateBalance", "description": "`null` is an unobserved balance, never a zero balance." } ] }, "displayName": { "type": "string" }, "financialAccountId": { "type": "string" }, "isDefault": { "type": "boolean" }, "kind": { "$ref": "#/components/schemas/FundingAccountKind" }, "network": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/Caip2Chain" } ] }, "refusal": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/SourceCandidateRefusal", "description": "Why a requote naming this wallet would be refused, by the venue's own wallet gate for\nthis card's amount (a Basic on-chain wallet's signing grant and its per-trade cap). Absent\nwhen the gate admits it, and for the card's paying wallet, whose price already passed it." } ] } }, "required": [ "financialAccountId", "kind", "displayName", "isDefault" ], "type": "object" }, "SourceCandidateRefusal": { "description": "An offered candidate the card's own requote would refuse: `reason` is the source reason token\nits `409 REQUOTE_REFUSED` carries as `details.reason`; `detail` says it in member words.", "properties": { "detail": { "type": "string" }, "reason": { "type": "string" } }, "required": [ "reason", "detail" ], "type": "object" }, "SourceOption": { "description": "New values may be added; treat unknown values as other.", "oneOf": [ { "properties": { "candidates": { "items": { "$ref": "#/components/schemas/SourceCandidate" }, "type": "array" }, "chain": { "$ref": "#/components/schemas/Caip2Chain" }, "family": { "$ref": "#/components/schemas/ChainFamily" }, "kind": { "description": "New values may be added; treat unknown values as other.", "enum": [ "wallet" ], "type": "string", "x-extensible-enum": true } }, "required": [ "family", "chain", "candidates", "kind" ], "type": "object" }, { "properties": { "candidates": { "items": { "$ref": "#/components/schemas/SourceCandidate" }, "type": "array" }, "kind": { "description": "New values may be added; treat unknown values as other.", "enum": [ "venueAccount" ], "type": "string", "x-extensible-enum": true } }, "required": [ "candidates", "kind" ], "type": "object" }, { "properties": { "candidates": { "items": { "$ref": "#/components/schemas/SourceCandidate" }, "type": "array" }, "kind": { "description": "New values may be added; treat unknown values as other.", "enum": [ "fundingAccount" ], "type": "string", "x-extensible-enum": true } }, "required": [ "candidates", "kind" ], "type": "object" }, { "properties": { "candidates": { "items": { "$ref": "#/components/schemas/SourceCandidate" }, "type": "array" }, "kind": { "description": "New values may be added; treat unknown values as other.", "enum": [ "deliverTo" ], "type": "string", "x-extensible-enum": true } }, "required": [ "candidates", "kind" ], "type": "object" } ], "x-extensible-enum": true }, "SourceSelection": { "additionalProperties": false, "description": "An explicit request choice. Every value is a financial-account id.", "properties": { "fundingAccountId": { "type": [ "string", "null" ] }, "tradingWallets": { "additionalProperties": { "type": "string" }, "propertyNames": { "description": "A CAIP-2 chain id (`eip155:8453`, `solana:`, `tron:shasta`), syntax-checked:\na namespace of 3 to 8 lowercase letters, digits or `-`, and a reference of 1 to 32\nletters, digits, `-` or `_`. Compared exactly, as CAIP-2 references are case-sensitive.", "example": "eip155:8453", "type": "string" }, "type": [ "object", "null" ] }, "venueAccountId": { "type": [ "string", "null" ] } }, "type": "object" }, "SpreadFromMid": { "description": "The spread from the Reference mid in basis points.\n\nNew values may be added; treat unknown values as other.", "discriminator": { "propertyName": "kind" }, "oneOf": [ { "properties": { "bps": { "format": "int64", "type": "integer" }, "kind": { "description": "New values may be added; treat unknown values as other.", "enum": [ "known" ], "type": "string", "x-extensible-enum": true } }, "required": [ "bps", "kind" ], "type": "object" }, { "properties": { "kind": { "description": "New values may be added; treat unknown values as other.", "enum": [ "unavailable" ], "type": "string", "x-extensible-enum": true }, "reason": { "description": "Known source reason tokens (not all apply to every status): `adapterPayloadSerializationFailed`, `basicVenueAccountsUnavailable`, `billingPaymentOverdue`, `walletNotOnChain`, `ccxtVenueRequiresCexLane`, `executionStageDisabled`, `jurisdictionUnproven`, `onboardedVenuesUnavailable`, `onchainAccountDefaultWalletRequired`, `onchainAccountDefaultWalletUnavailable`, `onchainAccountWalletRequired`, `onchainAssetDecimalsMismatch`, `onchainAssetIdentityMismatch`, `onchainAssetUnmapped`, `onchainAssetVariantFiltered`, `onchainWalletUnavailable`, `onchainCatalogueUnavailable`, `onchainDeliverToNotReceivingWallet`, `onchainDeliverToUnverified`, `onchainMarketsUnavailable`, `onchainMarketCatalogUnreadable`, `onchainMarketChainRequired`, `onchainMarketVariantRequired`, `onchainMarketTokenRequired`, `onchainSiteChainUnreadable`, `onchainWalletChainUnreadable`, `onchainWalletInactive`, `onchainWalletNotLinked`, `onchainWalletNotUsable`, `onchainWalletPickAmbiguous`, `onchainWalletWrongNetwork`, `signerLacksRight`, `signerUnavailable`, `signingGrantAmbiguous`, `signingGrantExpired`, `signingGrantRequired`, `signingGrantTokenNotKept`, `signingGrantTokenNotPayable`, `solverChainUnready`, `walletChainMismatch`, `walletNotUsableByYou`, `walletNotVerifiedForAce`, `walletNotWhitelisted`, `withdrawalChainUnsupported`, `accountFeeUnavailable`, `comparisonCostsUnavailable`, `connectionListingUnavailable`, `feeUnverified`, `noPool`, `noPrice`, `noSize`, `notFilled`, `notYetPublished`, `priceArithmetic`, `priceSourceNone`, `referenceMidUnavailable`, `settlementPrecisionUnavailable`, `accountSetupIncomplete`, `admissionUnavailable`, `advancedAccountEligibilityUnavailable`, `advancedAccountStateInconsistent`, `advancedConnectionDisabled`, `advancedConnectionNotConfigured`, `advancedConnectionPaused`, `advancedSettlementNeedsVerification`, `advancedModeDisabled`, `advancedNotAvailableForAccount`, `advancedNotEnabledForAccount`, `allowanceUnavailable`, `acrossCapacityExceeded`, `relayCapacityExceeded`, `acrossChainNotCarried`, `cctpChainNotCarried`, `relayChainNotCarried`, `apiKeyAdvancedWalletUnsupported`, `apiKeyOrganisationWalletScopeRequired`, `grantCapExceeded`, `amountAboveMaximum`, `amountBelowMinimum`, `amountUnreadable`, `amountsUnreadable`, `askFirst`, `authorityUnavailable`, `automationNeverAsks`, `availabilityUnreadable`, `backgroundNeverAsks`, `balanceUnreadable`, `defaultsUnavailable`, `walletHasNoAddress`, `walletUnavailable`, `bondAmountUnreadable`, `bondAssetUnreadable`, `catalogueUnavailable`, `chainFamilyUnknown`, `chainUnrecorded`, `clientSessionRequired`, `clockUnreadable`, `comingSoon`, `connectionChanged`, `connectionRevoked`, `corridorInvalid`, `credential`, `deadlineExceeded`, `defaultsLoading`, `deliverToCalldataUnsupported`, `deliverToTagUnsupported`, `deliverToNotPermitted`, `deliverToUnreadable`, `tradingPermissionRequired`, `directPatienceHarvest`, `economicallyInferior`, `exactAmountConflictsWithCard`, `exactAmountConflictsWithQuote`, `exactOutputDeliveryUnsupported`, `exactOutputEstimateUnavailable`, `exactRouteHypothesisUnavailable`, `expiredOnArrival`, `expiryUnknown`, `feeUnreadable`, `filteredOut`, `firmAskRefused`, `freshnessUnknown`, `fundingWindow`, `insufficientLiquidity`, `venueRelationship`, `venueRelationshipUnavailable`, `lpUnknown`, `mfaEnrolmentRequired`, `mfaRequired`, `minimumUnverified`, `mixedNetworks`, `netReceivedUnavailable`, `networkUnrecorded`, `noAddress`, `noCard`, `noFetcher`, `noInventory`, `noLaneForPair`, `noLegs`, `noOnChainCorridor`, `noPlannedVenue`, `noQuote`, `noRpc`, `notConnected`, `notEligible`, `notExecutable`, `orderPayloadMissing`, `outsideTopComposites`, `pairUnmapped`, `sellChainInvalid`, `permissionsUnreadable`, `placeOrderNotPermitted`, `prefundingMarkerUnreadable`, `prefundingRequired`, `indicative`, `priceOnRequest`, `priceOutOfRange`, `priceProtectionInvalid`, `pricingBookOnly`, `productNotQuoted`, `protocolChainMissing`, `providerFeeTreatmentUnknown`, `providerSiteUnrecorded`, `quoteIdUnissuable`, `quoteNotHeld`, `buyChainInvalid`, `buyAmountUnsupported`, `exactOutputDebitUnavailable`, `pairNotServed`, `receiveWalletNotServed`, `referenceMidUnreadable`, `referencePriceUnavailable`, `registryUnavailable`, `releaseRecheckUnavailable`, `requestUnbuildable`, `routeLegChainUnknown`, `routeLegUnnamed`, `routeLegUnplanned`, `routeUnavailable`, `secondFactorUnreadable`, `shortfallUnmeasured`, `shortfallUnreadable`, `singleChainVenue`, `siteChainUnreadable`, `sizeNotEligible`, `submitOrderBlocked`, `takerOnboardingIncomplete`, `tierNotQuoted`, `tradePaused`, `unsupportedNative`, `venueConnectionStorageUnavailable`, `venueDataStale`, `venueDeclined`, `venueNotConnected`, `venueNotEnabledForWorkspace`, `venueNotListed`, `venueTradeKeyUnavailable`, `venueTradeScopeRequired`, `venueTradeUnreadable`, `venueUnavailable`, `walletRefused`, `withdrawalFeeUnread`, `acrossRoutedViaCctp`, `apiKeyOrganisationWalletNotAllowlisted`, `balanceAvailabilityUnconfirmed`, `bankDestinationUnavailable`, `bebopJamKeyNotEnabled`, `bebopJamQuoteDeclined`, `bebopTokenUnavailable`, `relayCurrencyUnsupported`, `relaySwapImpactTooHigh`, `tetrafiSolverCallbackNotAuthorized`, `tradingLinkSnapshotChanged`, `tradingLinkSnapshotUnavailable`, `uniswapChainReadUnavailable`, `uniswapInsufficientDepth`, `uniswapQuoteUnreadable`, `uniswapUnwrapAboveDailyCap`, `uniswapUnwrapAboveTradeCap`, `uniswapRouteNotGranted`, `venueNotEnabled`, `askLimitReached`, `balanceMeaningUnconfirmed`, `bebopJamWalletUnsupported`, `bebopQuorumWalletTooSlow`, `bebopWalletQuorumUnreadable`, `connectionNotConfigured`, `deliveryAccountNetworkUnavailable`, `deliveryAccountUnavailable`, `destinationCannotSendOnChain`, `dexReferencePriceUnavailable`, `firmQuoteLimited`, `fundingAccountNetworkUnavailable`, `fundingAccountUnavailable`, `insufficientDepth`, `missingPermission`, `needsNativeGas`, `needsWallet`, `notPriced`, `payInTermsUnavailable`, `pilotTradeCapExceeded`, `platformFeeRateUnavailable`, `pricingBookPairUnserved`, `settlementDeclarationUnavailable`, `settlementNotAvailable`, `timedOut`, `timedOutBeforeSend`, `tradingSourceNetworkUnavailable`, `tradingSourceNotLinked`, `venueEnablementRechecking`, `venueEnablementUnavailable`, `venueListingTimedOut`, `venuePoliciesUnavailable`.\n\nNew values may be added; treat unknown values as other.", "type": "string" } }, "required": [ "reason", "kind" ], "type": "object" } ], "x-extensible-enum": true }, "StopReason": { "description": "Why a route stopped waiting on its taker.\n\nNew values may be added; treat unknown values as other.", "enum": [ "waitLimitReached", "stoppedByYou", "continuationComplianceRefused" ], "type": "string", "x-extensible-enum": true }, "TakerTransaction": { "description": "One transaction the Taker sends itself (an approval included).", "properties": { "chain": { "$ref": "#/components/schemas/Caip2Chain" }, "data": { "description": "Hex calldata (`0x…`).", "type": "string" }, "to": { "type": "string" }, "value": { "description": "Native value in base units, as a decimal string.", "type": "string" } }, "required": [ "chain", "data", "to", "value" ], "type": "object" }, "TradeActionRequired": { "description": "An action a person must take before the order can progress.", "properties": { "code": { "description": "Stable machine code: `AWAITING_TAKER_SIGNATURE`, `PRICE_MOVED`, `NEXT_LEG_DID_NOT_RUN`, `FINISH_TRADE`,\n`STOPPED` or `SUPPORT_REVIEW`.", "type": "string" }, "message": { "description": "Human-readable explanation of the action.", "type": "string" } }, "required": [ "code", "message" ], "type": "object" }, "TradeApiKey": { "properties": { "keyId": { "type": "string" }, "name": { "type": [ "string", "null" ] } }, "required": [ "keyId" ], "type": "object" }, "TradeCoverageState": { "description": "New values may be added; treat unknown values as other.", "enum": [ "unavailable" ], "type": "string", "x-extensible-enum": true }, "TradeDetail": { "allOf": [ { "anyOf": [ { "$ref": "#/components/schemas/CompanyTradeDetail" }, { "not": { "anyOf": [ { "required": [ "trade" ] }, { "required": [ "settlement" ] }, { "required": [ "lp" ] } ] } } ] }, { "anyOf": [ { "$ref": "#/components/schemas/CompanyVenueTradeListItem" }, { "not": { "anyOf": [ { "required": [ "connectionId" ] }, { "required": [ "operationId" ] }, { "required": [ "executionTypeId" ] }, { "required": [ "venueName" ] }, { "required": [ "venueAccountName" ] }, { "required": [ "providerSite" ] }, { "required": [ "createdAt" ] }, { "required": [ "submittedByYou" ] }, { "required": [ "sell" ] }, { "required": [ "buy" ] }, { "required": [ "executionStatus" ] }, { "required": [ "lifecycleStatus" ] } ] } } ] }, { "properties": { "kind": { "$ref": "#/components/schemas/TradeKind" }, "projection": { "$ref": "#/components/schemas/TradeProjection" }, "tradeId": { "type": "string" } }, "required": [ "tradeId", "kind", "projection" ], "type": "object" } ], "description": "One trade, read through the same projection as the list." }, "TradeDetailsSection": { "description": "Section A: Trade details.", "properties": { "amountUsd": { "description": "Absent when the order recorded no USD notional; never 0 for an unknown amount.", "format": "double", "type": [ "number", "null" ] }, "apiKey": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/TradeApiKey" } ] }, "channel": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/OrderChannel" } ] }, "createdAt": { "format": "date-time", "type": "string" }, "deferredSettlement": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/DeferredSettlementInfo" } ] }, "deliveredBuy": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/AssetAmountDisplay", "description": "The buy amount actually delivered: the figure `slippage_bps` and its\nprovenance are derived from, so an operator reading \"12 bps, measured\" can\nsee what landed. Absent when nothing was captured (unsettled, or a row\nwritten before the capture existed)." } ] }, "deliveredBuyProvenance": { "description": "Provenance of the delivered buy amount behind `slippage_bps`: `\"measured\"`\nwhen read back from settlement evidence, `\"quoted\"` when the quote-time\nvalue was carried forward unmeasured (slippage then reads 0 by\nconstruction). Absent for orders with no delivered capture and rows\npredating the capture.", "type": [ "string", "null" ] }, "executionPrice": { "$ref": "#/components/schemas/ExecutionPriceDisplay" }, "fillTimeMs": { "format": "int64", "minimum": 0, "type": [ "integer", "null" ] }, "lifecycleStatus": { "$ref": "#/components/schemas/TradeLifecycleStatus" }, "orderId": { "type": "string" }, "route": { "$ref": "#/components/schemas/TradeRouteDisplay" }, "routingPath": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/RoutingPath" } ] }, "routingPathLabel": { "type": "string" }, "slippageBps": { "format": "int64", "type": [ "integer", "null" ] }, "slippageToleranceBps": { "format": "double", "type": [ "number", "null" ] }, "status": { "type": "string" } }, "required": [ "orderId", "createdAt", "route", "routingPathLabel", "status", "lifecycleStatus", "executionPrice" ], "type": "object" }, "TradeFeeRow": { "properties": { "chain": { "type": "string" }, "feeKind": { "type": "string" }, "feePayer": { "type": "string" }, "feeUsd": { "format": "double", "type": [ "number", "null" ] }, "feeWei": { "type": [ "string", "null" ] }, "gasPriceWei": { "type": [ "string", "null" ] }, "gasUsed": { "type": [ "string", "null" ] }, "recordedAt": { "format": "date-time", "type": "string" }, "sequenceNumber": { "format": "int32", "type": "integer" }, "txHash": { "type": [ "string", "null" ] }, "txType": { "type": "string" } }, "required": [ "sequenceNumber", "txType", "chain", "feePayer", "feeKind", "recordedAt" ], "type": "object" }, "TradeKind": { "description": "The kinds the one trade history lists.\n\nNew values may be added; treat unknown values as other.", "enum": [ "order", "venueTrade" ], "type": "string", "x-extensible-enum": true }, "TradeKindCoverage": { "description": "A kind whose rows could not be read: the list is partial, never silently shorter.", "properties": { "kind": { "$ref": "#/components/schemas/TradeKind" }, "state": { "$ref": "#/components/schemas/TradeCoverageState" } }, "required": [ "kind", "state" ], "type": "object" }, "TradeKindExclusion": { "description": "A kind left out of the list because a filter or sort cannot apply to it, and which.", "properties": { "filter": { "description": "The query parameter that kind cannot honour (`corridor`, `sortBy`, ...).", "type": "string" }, "kind": { "$ref": "#/components/schemas/TradeKind" } }, "required": [ "kind", "filter" ], "type": "object" }, "TradeKindFilter": { "description": "Explicit population selection, not an unsupported-filter exclusion.", "enum": [ "all", "order", "venueTrade" ], "type": "string" }, "TradeLeg": { "description": "One leg of a trade in the request's own vocabulary: the Asset sold or bought, its chain\nwhen the leg is on-chain, and an amount whose meaning the field naming the leg states.", "properties": { "amount": { "$ref": "#/components/schemas/DecimalAmount" }, "asset": { "$ref": "#/components/schemas/AssetId" }, "chain": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/Caip2Chain", "description": "Absent for a leg held on a venue account (off-chain)." } ] } }, "required": [ "asset", "amount" ], "type": "object" }, "TradeLegConfirmAgainReason": { "description": "Why a deposit-first pay-in needs a new consent: the fresh\nprice missed the consented minimum receipt, or the bound lapsed before the\ndeposit was credited.\n\nNew values may be added; treat unknown values as other.", "enum": [ "priceBeyondBound", "boundLapsed" ], "type": "string", "x-extensible-enum": true }, "TradeLegDestination": { "description": "Where a payout leg delivers, by reference only: never bank or chain\ncoordinates.", "properties": { "approvalId": { "description": "The venue destination approval a wallet delivery goes through.", "format": "uuid", "type": [ "string", "null" ] }, "kind": { "$ref": "#/components/schemas/TradeLegDestinationKind" }, "ref": { "description": "The wallet id or the Treasury Destination id.", "type": "string" } }, "required": [ "kind", "ref" ], "type": "object" }, "TradeLegDestinationKind": { "description": "What a payout leg delivers to, in the binding's endpoint vocabulary.\n\nNew values may be added; treat unknown values as other.", "enum": [ "wallet", "bankDestination" ], "type": "string", "x-extensible-enum": true }, "TradeLegDirection": { "description": "Whether the leg brings money to the LP account before the trade, or takes\nthe trade's output away from it.\n\nNew values may be added; treat unknown values as other.", "enum": [ "pay_in", "payout" ], "type": "string", "x-extensible-enum": true }, "TradeLegFacts": { "description": "The leg facts an order read carries on `OrderLegInfo.tradeLeg`.", "properties": { "boundLapsesAt": { "description": "Deposit first: the instant the consented bound stops\nauthorizing the trade, 3× the deposit's expected arrival in the rail's\nbusiness time. Absent on a leg without a deposit-first bound.", "format": "date-time", "type": [ "string", "null" ] }, "confirmAgainReason": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/TradeLegConfirmAgainReason", "description": "Why a deposit-first pay-in in `price_beyond_bound` waits for a new consent." } ] }, "consentedPayoutFee": { "description": "The exact fee bound recorded by Confirm, derived from immutable consent.", "type": [ "string", "null" ] }, "creditedAmount": { "description": "The venue-credited amount that funded this pay-in, exact decimal.", "type": [ "string", "null" ] }, "currentPayoutFee": { "description": "The qualified estimate observed when dispatch stopped for a fee rise.", "type": [ "string", "null" ] }, "declaredPayoutFee": { "description": "Current qualified withdrawal estimate, returned by prepare in the receipt\nasset. An absent estimate never means a zero fee.", "type": [ "string", "null" ] }, "destination": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/TradeLegDestination" } ] }, "direction": { "$ref": "#/components/schemas/TradeLegDirection" }, "expectedArrivalAt": { "format": "date-time", "type": [ "string", "null" ] }, "expectedArrivalSource": { "description": "`provider` or `default`.", "type": [ "string", "null" ] }, "finality": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/TradeLegFinality", "description": "Whether a settled payout can still be returned. Absent for an unsettled leg or a settled leg without a provider return watch." } ] }, "fundingDeadlineAt": { "format": "date-time", "type": [ "string", "null" ] }, "fundingModel": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/FundingModel", "description": "A bank leg's funding model, fixed when it was planned. Absent on a\nchain leg." } ] }, "fundsReceivedAt": { "description": "The venue's own credit time of that amount.", "format": "date-time", "type": [ "string", "null" ] }, "holidaysApplied": { "type": [ "boolean", "null" ] }, "legId": { "format": "uuid", "type": "string" }, "outcomeCode": { "description": "The named reason on a refused, cancelled or returned leg.", "type": [ "string", "null" ] }, "overdueAt": { "format": "date-time", "type": [ "string", "null" ] }, "overdueSince": { "format": "date-time", "type": [ "string", "null" ] }, "ownBankVerification": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/OwnBankVerification", "description": "Independent bank evidence, never the venue-reported settlement state." } ] }, "payoutApproval": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/TradeLegPayoutApproval" } ] }, "payoutBreakdown": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/TradeLegPayoutBreakdown", "description": "A payout's amounts in its asset (operator 2026-10-22: every fee-bearing\naction shows what leaves the account, the fee and what arrives). Absent\non a pay-in and on a payout with no consent yet." } ] }, "payoutBreakdownUnavailableReason": { "description": "A payout whose fee/charging declaration could not be read. Never means no fee.", "type": [ "string", "null" ] }, "payoutHeldReason": { "description": "The funding-stage refusal code holding this planned payout: FUNDING_STAGE_DISABLED, EXECUTION_STOPPED, PILOT_PAYOUT_CAP_EXCEEDED, PILOT_DAILY_CAP_EXCEEDED or EXECUTION_NOTIONAL_UNVALUED. The leg stays planned and is retried; absent when not held.", "type": [ "string", "null" ] }, "quotedExpectedArrivalAt": { "description": "The confirmed quote's estimate for this exact bank rail and option.", "format": "date-time", "type": [ "string", "null" ] }, "rail": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/FiatRail", "description": "A bank leg's rail (`eft`, `sepa`, ...), fixed when it was planned. Absent\non a chain leg." } ] }, "railOption": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/FiatRailOptionKind", "description": "The rail option the bank leg uses (`standard` or `fast`)." } ] }, "railReference": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/PayoutRailReference", "description": "A genuine bank rail reference or named not-reported state; absent on non-bank-payout legs." } ] }, "recipientConfirmation": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/PayoutRecipientConfirmation", "description": "The receiving workspace's assertion, never settlement or independent verification." } ] }, "returnWindowEndsAt": { "description": "For a returnable leg whose rail documents a return window, midnight after its last day in the rail's clearing time zone. Absent when no window is documented; never estimated.", "format": "date-time", "type": [ "string", "null" ] }, "returnedAfterSettlement": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/TradeLegReturnedAfterSettlement", "description": "A settled payout the provider later returned. The leg\nstays `settled` (its row is immutable); the PayoutReturned review item\nis the one fact, and resolving that review keeps this annotation." } ] }, "returnedTo": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/TradeLegReturnedTo" } ] }, "reviewAt": { "format": "date-time", "type": [ "string", "null" ] }, "reviewEnteredAt": { "format": "date-time", "type": [ "string", "null" ] }, "reviewItemId": { "type": [ "string", "null" ] }, "reviewReason": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/TradeLegReviewReason" } ] }, "settlementRail": { "$ref": "#/components/schemas/TradeLegRail" }, "state": { "$ref": "#/components/schemas/TradeLegState" }, "submittedAt": { "format": "date-time", "type": [ "string", "null" ] }, "transactionHash": { "type": [ "string", "null" ] }, "venueReportedCredited": { "description": "Only an explicit receiving-bank credit report from the venue; withdrawal completion is not credit.", "type": [ "boolean", "null" ] }, "venueWithdrawalId": { "description": "A wallet payout's withdrawal as the venue recorded it, once sent: the\nvenue's own withdrawal id and the chain transaction. Absent before the send and\non a bank leg.", "type": [ "string", "null" ] } }, "required": [ "legId", "direction", "settlementRail", "state" ], "type": "object" }, "TradeLegFinality": { "description": "A settled payout's finality, from its return watch and any recorded payout-return review.\n\nNew values may be added; treat unknown values as other.", "enum": [ "final", "returnable", "returnedAfterSettlement" ], "type": "string", "x-extensible-enum": true }, "TradeLegPayoutApproval": { "description": "Treasury's existing Run approval for a bank payout. No funds are reserved\nwhile this approval is pending; release rechecks balances and terms.", "properties": { "approvalRequestId": { "format": "uuid", "type": [ "string", "null" ] }, "approvalsRequired": { "format": "int32", "minimum": 0, "type": "integer" }, "approverGroup": { "type": [ "string", "null" ] }, "approverGroupName": { "type": [ "string", "null" ] }, "approverNames": { "items": { "type": "string" }, "type": "array" }, "runId": { "format": "uuid", "type": [ "string", "null" ] } }, "required": [ "approvalsRequired", "approverNames" ], "type": "object" }, "TradeLegPayoutBreakdown": { "description": "What a payout takes from the venue account, its fee and what arrives, as exact decimals in the leg's asset. The venue sends gross minus fee. With on-top charging the account loses gross and the bank receives the amount sent; with deducted charging the bank receives one fee less; when unverified, withdrawn is the maximum debit and receivedMin to receivedMax bounds the receipt.", "properties": { "basis": { "$ref": "#/components/schemas/TradeLegPayoutBreakdownBasis", "description": "The withdrawal record these amounts come from." }, "charging": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/FiatFeeCharging", "description": "How the venue charges a bank payout's fee, as its rail declares it\n(`deducted`, `on_top`, `unverified`). Absent on a wallet payout, whose fee\nis Confirm's bound rather than a declared rail fee." } ] }, "fee": { "description": "The most fee: a bank payout's declared payout fee (frozen by the\nwithdrawal review once there is one), else Confirm's fee bound.", "type": "string" }, "receivedMax": { "description": "The most that arrives.", "type": "string" }, "receivedMin": { "description": "The least that arrives.", "type": "string" }, "withdrawn": { "description": "The most leaving the venue account: the confirmed trade's output.", "type": "string" } }, "required": [ "withdrawn", "fee", "receivedMin", "receivedMax", "basis" ], "type": "object" }, "TradeLegPayoutBreakdownBasis": { "description": "Which record a payout breakdown comes from.\n\nNew values may be added; treat unknown values as other.", "enum": [ "consent", "reviewed" ], "type": "string", "x-extensible-enum": true }, "TradeLegRail": { "description": "How the leg settles: a bank rail or a chain transfer.\n\nNew values may be added; treat unknown values as other.", "enum": [ "bank", "chain" ], "type": "string", "x-extensible-enum": true }, "TradeLegReturnedAfterSettlement": { "description": "A return the provider reported after the payout\nleg settled, read from its entry-coupled PayoutReturned review item.", "properties": { "detectedAt": { "description": "When TetraFi's own status read first saw the return.", "format": "date-time", "type": "string" }, "reviewItemId": { "description": "The PayoutReturned review item support works the return from.", "type": "string" } }, "required": [ "reviewItemId", "detectedAt" ], "type": "object" }, "TradeLegReturnedTo": { "description": "Where a returned leg's funds remain, according to its dispatch backend.\n\nNew values may be added; treat unknown values as other.", "enum": [ "lpAccount", "providerBalance" ], "type": "string", "x-extensible-enum": true }, "TradeLegReviewReason": { "description": "The reason a leg requires review.\n\nNew values may be added; treat unknown values as other.", "enum": [ "uncertain_send", "ambiguous_event", "expected_arrival_exceeded", "provider_failed_after_send", "trade_fill_requires_review", "late_funds_held", "late_funds_worse_rate", "amount_mismatch" ], "type": "string", "x-extensible-enum": true }, "TradeLegState": { "description": "The leg's state. The last five are terminal.\n\nNew values may be added; treat unknown values as other.", "enum": [ "planned", "awaiting_funds", "funds_received", "price_beyond_bound", "expired_unfunded", "late_funds", "awaiting_approval", "dispatching", "uncertain", "in_transit", "held_by_provider", "refunding", "manual_review", "settled", "returned", "refunded", "cancelled", "refused" ], "type": "string", "x-extensible-enum": true }, "TradeLifecycleBucket": { "description": "The history bucket chosen by the server's lifecycle projection.\n\nNew values may be added; treat unknown values as other.", "enum": [ "inProgress", "completed", "failed", "refunded", "unknown" ], "type": "string", "x-extensible-enum": true }, "TradeLifecycleStatus": { "properties": { "bucket": { "$ref": "#/components/schemas/TradeLifecycleBucket", "description": "Which history bucket this lifecycle belongs to: decided by the same arm that\nchose `primary`, so a filter on it can never disagree with the label." }, "execution": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/TradeLifecycleStep" } ] }, "flowKind": { "type": "string" }, "isTerminal": { "type": "boolean" }, "primary": { "$ref": "#/components/schemas/TradeLifecycleStep" }, "rank": { "format": "int32", "minimum": 0, "type": "integer" }, "rawDeferredStatus": { "type": [ "string", "null" ] }, "rawStatus": { "type": "string" }, "settlement": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/TradeLifecycleStep" } ] }, "withdrawal": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/TradeLifecycleStep" } ] } }, "required": [ "flowKind", "primary", "bucket", "isTerminal", "rank", "rawStatus" ], "type": "object" }, "TradeLifecycleStep": { "description": "A compact backend-owned display status for personal trade/order surfaces.\n\n`orders.settlement_status` remains a coarse analytics bucket; UI should use\nthis shape for user-facing execution/settlement state.", "properties": { "key": { "type": "string" }, "label": { "type": "string" }, "tone": { "type": "string" } }, "required": [ "key", "label", "tone" ], "type": "object" }, "TradeList": { "description": "One page of the trade history.", "properties": { "coverage": { "description": "Taker projections: kinds whose rows could not be read; the list shows the rest.", "items": { "$ref": "#/components/schemas/TradeKindCoverage" }, "type": "array" }, "excludedKinds": { "description": "Taker projections: kinds a filter or sort left out, each with the parameter it could not apply.", "items": { "$ref": "#/components/schemas/TradeKindExclusion" }, "type": "array" }, "items": { "items": { "$ref": "#/components/schemas/TradeRecord" }, "type": "array" }, "latestTradeAt": { "description": "Newest `createdAt` the caller may see in this projection, ignoring every filter.", "format": "date-time", "type": [ "string", "null" ] }, "limit": { "description": "The page size applied.", "format": "int32", "minimum": 0, "type": "integer" }, "makerContext": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/MakerListContext", "description": "Maker projections only: what the fills or settlement-queue read returned about\nthe page beyond its rows, unchanged. Absent for every taker projection." } ] }, "nextCursor": { "description": "Pass as `cursor` for the next page; null on the last page.", "type": [ "string", "null" ] }, "scope": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/TradeListScope", "description": "Taker projections: whose orders the list holds (every workspace order, or the caller's own)." } ] }, "total": { "description": "Rows matching the filters in this projection.", "format": "int64", "minimum": 0, "type": "integer" } }, "required": [ "items", "total", "limit" ], "type": "object" }, "TradeListScope": { "description": "The order visibility scope used for the trade list.\n\nNew values may be added; treat unknown values as other.", "enum": [ "workspace", "own" ], "type": "string", "x-extensible-enum": true }, "TradePerspective": { "description": "Which side of the trade the workspace was on.", "enum": [ "taker", "maker" ], "type": "string" }, "TradeProjection": { "description": "Which view of trades answers the request: the caller's own, the workspace's,\na broker's umbrella, an LP's fills, or an LP's unsettled orders.\n\nNew values may be added; treat unknown values as other.", "enum": [ "mine", "workspace", "umbrella", "maker", "settlement" ], "type": "string", "x-extensible-enum": true }, "TradeRecord": { "allOf": [ { "anyOf": [ { "$ref": "#/components/schemas/CompanyTradeListItem" }, { "not": { "anyOf": [ { "required": [ "orderId" ] }, { "required": [ "createdAt" ] }, { "required": [ "submittedByYou" ] }, { "required": [ "route" ] }, { "required": [ "lpName" ] }, { "required": [ "lpSource" ] }, { "required": [ "routingPathLabel" ] }, { "required": [ "status" ] }, { "required": [ "settlementStatus" ] }, { "required": [ "lifecycleStatus" ] }, { "required": [ "executionPrice" ] } ] } } ] }, { "anyOf": [ { "$ref": "#/components/schemas/CompanyVenueTradeListItem" }, { "not": { "anyOf": [ { "required": [ "connectionId" ] }, { "required": [ "operationId" ] }, { "required": [ "executionTypeId" ] }, { "required": [ "venueName" ] }, { "required": [ "venueAccountName" ] }, { "required": [ "providerSite" ] }, { "required": [ "createdAt" ] }, { "required": [ "submittedByYou" ] }, { "required": [ "sell" ] }, { "required": [ "buy" ] }, { "required": [ "executionStatus" ] }, { "required": [ "lifecycleStatus" ] } ] } } ] }, { "properties": { "kind": { "$ref": "#/components/schemas/TradeKind" }, "projection": { "$ref": "#/components/schemas/TradeProjection", "description": "Which projection produced the row." }, "tradeId": { "description": "The order id, or a venue trade's operation id; the detail is `…/trades/{tradeId}`.", "type": "string" } }, "required": [ "tradeId", "kind", "projection" ], "type": "object" } ], "description": "One trade in the trade history.\n\nThe core (`tradeId`, `kind`, `projection`) is on every row. Taker rows carry the\norder or venue-trade fields at the top level, exactly as the taker list has\nalways returned them; `umbrella` is set only on umbrella rows and `maker` only\non maker rows." }, "TradeRouteDisplay": { "description": "The sold and bought sides of a trade for display read models.", "properties": { "buy": { "$ref": "#/components/schemas/AssetAmountDisplay", "description": "What the order buys." }, "sell": { "$ref": "#/components/schemas/AssetAmountDisplay", "description": "What the order sells." } }, "required": [ "sell", "buy" ], "type": "object" }, "TradeScope": { "description": "Whose rows the list reads.", "enum": [ "mine", "workspace", "umbrella" ], "type": "string" }, "TradesFormat": { "description": "The representation of the list.", "enum": [ "json", "csv" ], "type": "string" }, "TradingSource": { "description": "The exact source selected for a quote, retained through execution and recovery.\n\nNew values may be added; treat unknown values as other.", "oneOf": [ { "properties": { "financialAccountId": { "type": "string" }, "kind": { "description": "New values may be added; treat unknown values as other.", "enum": [ "venueAccount" ], "type": "string", "x-extensible-enum": true }, "venueEnablementId": { "type": "string" } }, "required": [ "venueEnablementId", "financialAccountId", "kind" ], "type": "object" }, { "properties": { "financialAccountId": { "type": "string" }, "kind": { "description": "New values may be added; treat unknown values as other.", "enum": [ "wallet" ], "type": "string", "x-extensible-enum": true }, "network": { "$ref": "#/components/schemas/Caip2Chain" }, "venueEnablementId": { "type": "string" } }, "required": [ "venueEnablementId", "financialAccountId", "network", "kind" ], "type": "object" } ], "x-extensible-enum": true }, "TxReference": { "description": "On-chain transaction reference with explorer URL.", "properties": { "chain": { "type": "string" }, "explorerUrl": { "type": "string" }, "hash": { "type": "string" } }, "required": [ "hash", "explorerUrl", "chain" ], "type": "object" }, "UnspentPay": { "description": "The part of a `sellAmount` a card does not spend, in the sell asset, and why in words.", "properties": { "amount": { "$ref": "#/components/schemas/DecimalAmount" }, "detail": { "description": "One sentence naming the venue, what the order spends and where the rest stays.", "type": "string" }, "rule": { "description": "The venue's rule that leaves the rest, in a few words for the card (\"Binance trades USDC in\nsteps of 1\"). Absent when the venue's step was not read; `detail` then says \"fills whole lots\".", "type": [ "string", "null" ] } }, "required": [ "amount", "detail" ], "type": "object" }, "UpdateWebhookRequest": { "additionalProperties": false, "description": "Partial update of a webhook endpoint. Omitted fields retain their current values.", "properties": { "active": { "type": [ "boolean", "null" ] }, "events": { "items": { "type": "string" }, "type": [ "array", "null" ] }, "url": { "type": [ "string", "null" ] } }, "type": "object" }, "VariantKind": { "description": "How a token deployment represents its Asset: the Asset itself, or a 1:1\nrepresentation of it. A token with different economics is its own Asset, never a\nvariant.\n\nNew values may be added; treat unknown values as other.", "enum": [ "native", "bridged", "wrapped", "omnichain", "test" ], "type": "string", "x-extensible-enum": true }, "VariantPreference": { "description": "New values may be added; treat unknown values as other.", "enum": [ "any", "nativeOnly" ], "type": "string", "x-extensible-enum": true }, "VenueAccountStep": { "description": "The step a `manageVenueAccount` fix names on the venue account.\n\nNew values may be added; treat unknown values as other.", "enum": [ "verify", "resume", "reenterKey" ], "type": "string", "x-extensible-enum": true }, "VenueBalanceLine": { "description": "One asset's balance at the venue: its total, free and locked amounts, what is\navailable after TetraFi's open trades and withdrawals, and its USD value.", "properties": { "asset": { "type": "string" }, "assetMarker": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/InventoryAsset", "description": "Provider-read canonical fiat identity; never inferred from the asset symbol." } ] }, "available": { "description": "The available balance: the provider's free cash less TetraFi's open\ntrades and withdrawals. Null when unknown (a credit line, or holds not\nread); \"0\" when they use all of it; never negative. A display figure,\nnever a spend authorization.", "type": [ "string", "null" ] }, "free": { "type": "string" }, "locked": { "description": "`null` when credit availability prevents deriving actual locked cash.", "type": [ "string", "null" ] }, "total": { "type": "string" }, "usdPriceSource": { "description": "`null` when no reference price is available; never 0.", "type": [ "string", "null" ] }, "usdValue": { "description": "Unrounded total × reference USD price. `null` when no reference price is available;\nnever 0.", "type": [ "string", "null" ] } }, "required": [ "asset", "total", "free" ], "type": "object" }, "VenueBankArrivalUnavailableReason": { "description": "New values may be added; treat unknown values as other.", "enum": [ "defaults_not_declared", "depends_on_rail", "no_bank_side", "rail_not_offered", "no_pay_in_terms", "ambiguous_pay_in_terms", "no_calendar", "provider_value_only", "computation_failed" ], "type": "string", "x-extensible-enum": true }, "VenueBankDepositFee": { "description": "The venue's declared fee for a bank deposit on the instructions' rail. declared with amount 0 is a documented free deposit; unverified means the rail's fee has not been sourced; unavailable names why the terms could not be read and never means free.\n\nNew values may be added; treat unknown values as other.", "oneOf": [ { "properties": { "amount": { "description": "An exact non-negative decimal in `currency`.", "type": "string" }, "charging": { "$ref": "#/components/schemas/FiatFeeCharging" }, "currency": { "type": "string" }, "source": { "description": "The declaration's cited source.", "type": "string" }, "status": { "description": "New values may be added; treat unknown values as other.", "enum": [ "declared" ], "type": "string", "x-extensible-enum": true } }, "required": [ "amount", "currency", "charging", "source", "status" ], "type": "object" }, { "properties": { "status": { "description": "New values may be added; treat unknown values as other.", "enum": [ "unverified" ], "type": "string", "x-extensible-enum": true } }, "required": [ "status" ], "type": "object" }, { "properties": { "reason": { "$ref": "#/components/schemas/VenueBankArrivalUnavailableReason" }, "status": { "description": "New values may be added; treat unknown values as other.", "enum": [ "unavailable" ], "type": "string", "x-extensible-enum": true } }, "required": [ "reason", "status" ], "type": "object" } ], "x-extensible-enum": true }, "VenueBankDepositInstructions": { "description": "The venue's bank deposit instructions for one fiat currency, read live from\nthe bound account. Absent when the read failed: no reference is ever guessed.", "properties": { "currency": { "type": "string" }, "depositFee": { "$ref": "#/components/schemas/VenueBankDepositFee", "description": "The venue's own fee on this deposit, from the same declared pay-in terms\nas `expected_arrival`. The sender's bank may charge its own, which this\nnever includes." }, "depositReference": { "description": "The account's own deposit reference (VALR: `VR…`); pay with it exactly.", "type": "string" }, "expectedArrival": { "$ref": "#/components/schemas/VenueBankExpectedArrival" }, "observedAt": { "description": "When the instructions were read.", "format": "date-time", "type": "string" }, "ownNameRequired": { "description": "The venue only accepts a deposit from a bank account in the account\nholder's own name.", "type": "boolean" }, "rails": { "description": "Bank rails the venue accepts for this deposit (`eft`).", "items": { "type": "string" }, "type": "array" }, "receivingDetails": { "$ref": "#/components/schemas/VenueBankReceivingDetails" }, "testAccount": { "description": "The bound venue account is on a test site: never send real funds to it.\nClients key the warning on this flag, never on the reason text.", "type": "boolean" } }, "required": [ "currency", "rails", "depositReference", "receivingDetails", "ownNameRequired", "testAccount", "expectedArrival", "depositFee", "observedAt" ], "type": "object" }, "VenueBankDepositRead": { "description": "What the venue account's bank-deposit read established for one currency.\nReceiving coordinates and the deposit reference, when read, remain in\n`bankInstructions` on the same response.", "properties": { "currency": { "type": "string" }, "reason": { "type": "string" }, "reasonCode": { "type": "string" }, "state": { "$ref": "#/components/schemas/VenueBankDepositReadState" } }, "required": [ "currency", "state", "reason", "reasonCode" ], "type": "object" }, "VenueBankDepositReadState": { "description": "An absent bank offering is different from an unreadable source. A successful\nreference-only read does not establish the venue's receiving bank account.\n\nNew values may be added; treat unknown values as other.", "enum": [ "available", "notOffered", "referenceOnly", "unread" ], "type": "string", "x-extensible-enum": true }, "VenueBankDetailsUnavailableReason": { "description": "New values may be added; treat unknown values as other.", "enum": [ "venue_api_does_not_expose" ], "type": "string", "x-extensible-enum": true }, "VenueBankExpectedArrival": { "description": "The rail's expected arrival for a bank deposit or payout, counted in business time on its calendar. unavailable is never a computed date and sets neither overdue nor manual-review times.\n\nNew values may be added; treat unknown values as other.", "oneOf": [ { "properties": { "basis": { "$ref": "#/components/schemas/FiatArrivalBasis" }, "expectedArrivalAt": { "format": "date-time", "type": "string" }, "manualReviewAt": { "description": "Three times the expected business span from submission: manual review and the lapse of a deposit-first bound.", "format": "date-time", "type": "string" }, "overdueAt": { "description": "Expected arrival plus the grace period: the overdue warning.", "format": "date-time", "type": "string" }, "publicHolidaysApplied": { "description": "False when a date the computation crossed lies outside the rail's\npublic-holiday table: shown as \"public holidays not applied\".", "type": "boolean" }, "source": { "description": "The declaration's cited source for the rule.", "type": "string" }, "status": { "description": "New values may be added; treat unknown values as other.", "enum": [ "expected" ], "type": "string", "x-extensible-enum": true } }, "required": [ "expectedArrivalAt", "overdueAt", "manualReviewAt", "basis", "publicHolidaysApplied", "source", "status" ], "type": "object" }, { "properties": { "reason": { "$ref": "#/components/schemas/VenueBankArrivalUnavailableReason" }, "status": { "description": "New values may be added; treat unknown values as other.", "enum": [ "unavailable" ], "type": "string", "x-extensible-enum": true } }, "required": [ "reason", "status" ], "type": "object" } ], "x-extensible-enum": true }, "VenueBankReceivingDetails": { "description": "The venue's receiving bank account. unavailable carries no stale or guessed details. The full account number appears only on the explicit deposit-instructions read, with no-store and every disclosure audited without the number. Lists, quotes, cards, legs and connections stay masked.\n\nNew values may be added; treat unknown values as other.", "oneOf": [ { "properties": { "accountHolder": { "type": "string" }, "accountNumber": { "type": "string" }, "bankAddress": { "description": "The receiving bank's address, as the venue gives it.", "type": [ "string", "null" ] }, "bankName": { "type": "string" }, "beneficiaryAddress": { "description": "The account holder's address, as the venue gives it.", "type": [ "string", "null" ] }, "branchCode": { "type": [ "string", "null" ] }, "routingNumber": { "description": "The receiving bank's routing number; ABA for Circle.", "type": [ "string", "null" ] }, "status": { "description": "New values may be added; treat unknown values as other.", "enum": [ "available" ], "type": "string", "x-extensible-enum": true }, "swiftCode": { "type": [ "string", "null" ] } }, "required": [ "bankName", "accountHolder", "accountNumber", "status" ], "type": "object" }, { "properties": { "reason": { "$ref": "#/components/schemas/VenueBankDetailsUnavailableReason" }, "status": { "description": "New values may be added; treat unknown values as other.", "enum": [ "unavailable" ], "type": "string", "x-extensible-enum": true } }, "required": [ "reason", "status" ], "type": "object" } ], "x-extensible-enum": true }, "VenueCapabilityEvidence": { "properties": { "capability": { "type": "string" }, "code": { "description": "The named refusal behind this row, when one applies. Absent when none applies.", "type": [ "string", "null" ] }, "controlRevision": { "format": "int64", "type": "integer" }, "credentialRevision": { "format": "int64", "type": "integer" }, "expiresAt": { "format": "date-time", "type": [ "string", "null" ] }, "freshness": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/CapabilityFreshness" } ] }, "observedAt": { "format": "date-time", "type": [ "string", "null" ] }, "reason": { "type": "string" }, "reasonCode": { "description": "Stable SCREAMING_SNAKE token naming why `reason` says what it says.\nThe UI keys copy on it; it never gates admission (state/source/revisions do).", "type": "string" }, "source": { "type": "string" }, "state": { "$ref": "#/components/schemas/CapabilityState" } }, "required": [ "capability", "state", "reason", "reasonCode", "source", "credentialRevision", "controlRevision" ], "type": "object" }, "VenueConnectionBalances": { "description": "The wire shape of GET …/venue-accounts/{venueAccountId}/balances.", "properties": { "accountBindingStatus": { "type": "string" }, "balances": { "description": "`null` means no observation; `[]` means an actual empty snapshot.\nInactive accounts may return historical values only with stale state and\n`provider_api_last_known` provenance. These never authorize spending.", "items": { "$ref": "#/components/schemas/VenueBalanceLine" }, "type": [ "array", "null" ] }, "connectionId": { "type": "string" }, "controlRevision": { "format": "int64", "type": "integer" }, "credentialRevision": { "format": "int64", "type": "integer" }, "executionOffering": { "$ref": "#/components/schemas/IntegrationMode" }, "executionTypeId": { "description": "The execution type (compiled spec id), not the catalogue Venue.", "type": "string" }, "expiresAt": { "format": "date-time", "type": [ "string", "null" ] }, "observedAt": { "format": "date-time", "type": [ "string", "null" ] }, "providerSite": { "type": "string" }, "reason": { "type": "string" }, "reasonCode": { "description": "A named balance-read refusal, distinct from a missing observation.", "type": [ "string", "null" ] }, "source": { "type": "string" }, "spendingReadiness": { "$ref": "#/components/schemas/CapabilityState" }, "state": { "$ref": "#/components/schemas/CapabilityState" }, "workspaceId": { "type": "string" } }, "required": [ "connectionId", "workspaceId", "executionTypeId", "providerSite", "executionOffering", "accountBindingStatus", "credentialRevision", "controlRevision", "state", "reason", "source", "spendingReadiness" ], "type": "object" }, "VenueConnectionDepositHistory": { "properties": { "asset": { "type": "string" }, "chainRef": { "type": "string" }, "connection": { "$ref": "#/components/schemas/VenueConnectionStatus" }, "credits": { "description": "`null` means unavailable, never an empty successful history.", "items": { "$ref": "#/components/schemas/VenueDepositCredit" }, "type": [ "array", "null" ] }, "expiresAt": { "format": "date-time", "type": [ "string", "null" ] }, "networkCode": { "type": "string" }, "networkConfirmed": { "description": "False when the venue declares no network for this asset: `networkCode` is\nempty and credits are matched by asset only.", "type": "boolean" }, "observedAt": { "format": "date-time", "type": [ "string", "null" ] }, "reason": { "type": "string" }, "reasonCode": { "type": "string" }, "since": { "format": "date-time", "type": "string" }, "state": { "$ref": "#/components/schemas/CapabilityState" }, "until": { "format": "date-time", "type": "string" } }, "required": [ "connection", "state", "reason", "reasonCode", "asset", "chainRef", "networkCode", "networkConfirmed", "since", "until" ], "type": "object" }, "VenueConnectionDeposits": { "properties": { "bankDeposit": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/VenueBankDepositRead", "description": "Present when a bank currency is selected: receiving account available,\nreference only, not offered by the venue, or unread with its reason." } ] }, "bankInstructions": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/VenueBankDepositInstructions" } ] }, "connection": { "$ref": "#/components/schemas/VenueConnectionStatus" }, "instructions": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/VenueDepositInstructions" } ] }, "options": { "items": { "$ref": "#/components/schemas/VenueDepositOption" }, "type": "array" }, "reason": { "type": "string" }, "reasonCode": { "type": "string" }, "state": { "$ref": "#/components/schemas/CapabilityState" }, "unconfirmedNetworkAssets": { "description": "Catalogue assets for which the venue declares no network mapping. Any\nregistry `chainRef` may be requested; its network is never confirmed.", "items": { "type": "string" }, "type": "array" } }, "required": [ "connection", "state", "reason", "reasonCode", "options", "unconfirmedNetworkAssets" ], "type": "object" }, "VenueConnectionStatus": { "properties": { "accountBindingStatus": { "type": "string" }, "accountId": { "description": "The venue account this connection is an execution type of\n(`venue_enablements.account_id`), never the binding id above.", "type": "string" }, "capabilities": { "items": { "$ref": "#/components/schemas/VenueCapabilityEvidence" }, "type": "array" }, "connectionId": { "type": "string" }, "controlRevision": { "format": "int64", "type": "integer" }, "createdAt": { "format": "date-time", "type": "string" }, "credentialRevision": { "format": "int64", "type": "integer" }, "executionOffering": { "$ref": "#/components/schemas/IntegrationMode" }, "executionTypeId": { "description": "The execution type (compiled spec id), not the catalogue Venue.", "type": "string" }, "fundingLinks": { "description": "Cached active links on this venue account, never another account's links.", "items": { "$ref": "#/components/schemas/FundingLinkCandidate" }, "type": "array" }, "keyFingerprint": { "description": "The bound key's fingerprint; absent only for a venue whose catalogue declares no key.", "type": [ "string", "null" ] }, "label": { "type": "string" }, "lifecycle": { "type": "string" }, "providerSite": { "type": "string" }, "tradePaused": { "type": "boolean" }, "tradingSource": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/TradingSource", "description": "Cached stored financial-account identity. Missing is unavailable, never inferred." } ] }, "updatedAt": { "format": "date-time", "type": "string" }, "venueEnablementId": { "description": "The workspace venue account this connection binds. Rotation keeps it, so a\nchange of id means a different account, not a newer key.", "type": "string" }, "withdrawalPaused": { "type": "boolean" }, "workspaceId": { "type": "string" } }, "required": [ "connectionId", "workspaceId", "executionTypeId", "providerSite", "executionOffering", "label", "venueEnablementId", "accountId", "accountBindingStatus", "credentialRevision", "controlRevision", "lifecycle", "tradePaused", "withdrawalPaused", "createdAt", "updatedAt", "capabilities" ], "type": "object" }, "VenueDepositCredit": { "properties": { "amount": { "type": "string" }, "transactionHash": { "type": [ "string", "null" ] }, "unverifiedFields": { "description": "Fields the venue record did not carry (`network`, `fee`); unverified for this credit.", "items": { "type": "string" }, "type": "array" }, "venueDepositId": { "type": "string" }, "venueRecordedAt": { "format": "date-time", "type": "string" } }, "required": [ "venueDepositId", "amount", "venueRecordedAt", "unverifiedFields" ], "type": "object" }, "VenueDepositInstructions": { "properties": { "address": { "type": "string" }, "asset": { "type": "string" }, "chainRef": { "type": "string" }, "expiresAt": { "format": "date-time", "type": "string" }, "memo": { "type": [ "string", "null" ] }, "networkCode": { "type": "string" }, "networkConfirmed": { "description": "False when the venue reports no network for this address: `networkCode`\nis empty and `chainRef` is the caller's selection, which the customer\nmust confirm with the venue before sending.", "type": "boolean" }, "observedAt": { "format": "date-time", "type": "string" }, "tokenContract": { "type": "string" } }, "required": [ "asset", "chainRef", "networkCode", "networkConfirmed", "address", "tokenContract", "observedAt", "expiresAt" ], "type": "object" }, "VenueDepositOption": { "description": "Configured native mapping; availability still needs a live provider read.", "properties": { "asset": { "type": "string" }, "chainRef": { "type": "string" }, "networkCode": { "type": "string" } }, "required": [ "asset", "chainRef", "networkCode" ], "type": "object" }, "VenueEnablement": { "description": "One of the workspace's venue accounts: its account at one venue and provider site. accountId is the {venueAccountId} of the venue-account balance, deposit-history and deposit-instructions reads. Only the documented fields are part of the integrator contract; undocumented fields may be sent and must be ignored.", "properties": { "accountId": { "description": "The venue account id: pass it as `{venueAccountId}` to\n`…/venue-accounts/{venueAccountId}/balances`, `/deposit-history` and\n`/deposit-instructions`.", "type": "string" }, "createdAt": { "format": "date-time", "type": "string" }, "integrationMode": { "$ref": "#/components/schemas/IntegrationMode", "description": "The account's base integration mode: basic or advanced." }, "label": { "type": "string" }, "lifecycle": { "$ref": "#/components/schemas/VenueEnablementLifecycle" }, "providerSite": { "type": "string" }, "revokedAt": { "description": "When the account was removed, from its recorded removal event. Null while the\naccount is not revoked, and on a revoked account whose removal was never recorded\n(unknown, never derived from `updatedAt`).", "format": "date-time", "type": [ "string", "null" ] }, "tradePaused": { "type": "boolean" }, "updatedAt": { "format": "date-time", "type": "string" }, "venueEnablementId": { "description": "The venue enablement identifier: the id of `…/venue-enablements/{venueEnablementId}`\nreads and controls. Not the venue account id.", "type": "string" }, "venueId": { "description": "The venue this account belongs to, by catalogue id (for example valr). Absent only when the stored account maps to no known venue.", "type": [ "string", "null" ] }, "venueKind": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/CatalogueVenueKind", "description": "The Venue's kind; absent when the Venue is unknown." } ] }, "withdrawalPaused": { "type": "boolean" }, "workspaceId": { "type": "string" } }, "required": [ "accountId", "createdAt", "integrationMode", "label", "lifecycle", "providerSite", "tradePaused", "updatedAt", "venueEnablementId", "withdrawalPaused", "workspaceId" ], "type": "object" }, "VenueEnablementLifecycle": { "description": "The account lifecycle. `funding_only` belongs to the account alone: its last\ntrading venue was disabled and a funding use still binds the balance key.\nAn unknown stored value is a decode error, never a default.\n\nNew values may be added; treat unknown values as other.", "enum": [ "pending", "configured", "funding_only", "disabled", "revoked" ], "type": "string", "x-extensible-enum": true }, "VenueEnablementsPage": { "description": "One page of the workspace's venue accounts, oldest first.", "properties": { "items": { "description": "The workspace's venue accounts on this page. Each item's `accountId` is the\n`{venueAccountId}` of the venue-account balance and deposit reads.", "items": { "$ref": "#/components/schemas/VenueEnablement" }, "type": "array" }, "nextCursor": { "description": "Pass as `cursor` for the next page; explicit null marks the last page.", "type": [ "string", "null" ] } }, "required": [ "items", "nextCursor" ], "type": "object" }, "VenueExecution": { "description": "A venue account's recorded execution facts, never protocol network metadata.", "properties": { "site": { "$ref": "#/components/schemas/VenueSiteLabel" }, "siteChain": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/Caip2Chain", "description": "The one network the card's venue account trades on, when the venue holds one account\nper network: each network's account answers with its own card, titled by this chain.\nAbsent for an off-chain account and for a bridge, whose account spans its networks." } ] }, "stage": { "$ref": "#/components/schemas/VenueExecutionStage" }, "status": { "$ref": "#/components/schemas/VenueExecutionStatus" } }, "required": [ "stage", "site", "status" ], "type": "object" }, "VenueExecutionStage": { "description": "The execution stage of one venue, mode and provider site.\n\nNew values may be added; treat unknown values as other.", "oneOf": [ { "description": "Normal execution with no TetraFi caps.", "properties": { "kind": { "description": "New values may be added; treat unknown values as other.", "enum": [ "live" ], "type": "string", "x-extensible-enum": true } }, "required": [ "kind" ], "type": "object" }, { "description": "Real execution, capped: per trade (USD notional) and per UTC day across all\nworkspaces.", "properties": { "kind": { "description": "New values may be added; treat unknown values as other.", "enum": [ "pilot" ], "type": "string", "x-extensible-enum": true }, "maxPerDayUsd": { "format": "int32", "minimum": 0, "type": "integer" }, "maxPerTradeUsd": { "format": "int32", "minimum": 0, "type": "integer" } }, "required": [ "maxPerTradeUsd", "maxPerDayUsd", "kind" ], "type": "object" }, { "description": "No execution; the price may still be shown.", "properties": { "kind": { "description": "New values may be added; treat unknown values as other.", "enum": [ "disabled" ], "type": "string", "x-extensible-enum": true }, "reason": { "type": "string" } }, "required": [ "reason", "kind" ], "type": "object" } ], "x-extensible-enum": true }, "VenueExecutionStatus": { "description": "Whether this principal can execute the card now, and why not.\n\nNew values may be added; treat unknown values as other.", "oneOf": [ { "properties": { "kind": { "description": "New values may be added; treat unknown values as other.", "enum": [ "executable" ], "type": "string", "x-extensible-enum": true }, "withinLimit": { "description": "\"Execute within my limit\" applies: the venue's firm quote lives under\nabout 5 s, so the person sets a minimum receive and the server executes only\nwithin it. `false`: the firm quote is confirmed before its expiry.", "type": "boolean" } }, "required": [ "withinLimit", "kind" ], "type": "object" }, { "properties": { "kind": { "description": "New values may be added; treat unknown values as other.", "enum": [ "notExecutable" ], "type": "string", "x-extensible-enum": true }, "policyRule": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/QuotePolicyRule", "description": "The rule or refusal that blocked the card when `reason` is a policy\nblock, so the page can name and link it; absent otherwise and when\nthe policy could not be read." } ] }, "reason": { "description": "Known source reason tokens (not all apply to every status): `adapterPayloadSerializationFailed`, `basicVenueAccountsUnavailable`, `billingPaymentOverdue`, `walletNotOnChain`, `ccxtVenueRequiresCexLane`, `executionStageDisabled`, `jurisdictionUnproven`, `onboardedVenuesUnavailable`, `onchainAccountDefaultWalletRequired`, `onchainAccountDefaultWalletUnavailable`, `onchainAccountWalletRequired`, `onchainAssetDecimalsMismatch`, `onchainAssetIdentityMismatch`, `onchainAssetUnmapped`, `onchainAssetVariantFiltered`, `onchainWalletUnavailable`, `onchainCatalogueUnavailable`, `onchainDeliverToNotReceivingWallet`, `onchainDeliverToUnverified`, `onchainMarketsUnavailable`, `onchainMarketCatalogUnreadable`, `onchainMarketChainRequired`, `onchainMarketVariantRequired`, `onchainMarketTokenRequired`, `onchainSiteChainUnreadable`, `onchainWalletChainUnreadable`, `onchainWalletInactive`, `onchainWalletNotLinked`, `onchainWalletNotUsable`, `onchainWalletPickAmbiguous`, `onchainWalletWrongNetwork`, `signerLacksRight`, `signerUnavailable`, `signingGrantAmbiguous`, `signingGrantExpired`, `signingGrantRequired`, `signingGrantTokenNotKept`, `signingGrantTokenNotPayable`, `solverChainUnready`, `walletChainMismatch`, `walletNotUsableByYou`, `walletNotVerifiedForAce`, `walletNotWhitelisted`, `withdrawalChainUnsupported`, `accountFeeUnavailable`, `comparisonCostsUnavailable`, `connectionListingUnavailable`, `feeUnverified`, `noPool`, `noPrice`, `noSize`, `notFilled`, `notYetPublished`, `priceArithmetic`, `priceSourceNone`, `referenceMidUnavailable`, `settlementPrecisionUnavailable`, `accountSetupIncomplete`, `admissionUnavailable`, `advancedAccountEligibilityUnavailable`, `advancedAccountStateInconsistent`, `advancedConnectionDisabled`, `advancedConnectionNotConfigured`, `advancedConnectionPaused`, `advancedSettlementNeedsVerification`, `advancedModeDisabled`, `advancedNotAvailableForAccount`, `advancedNotEnabledForAccount`, `allowanceUnavailable`, `acrossCapacityExceeded`, `relayCapacityExceeded`, `acrossChainNotCarried`, `cctpChainNotCarried`, `relayChainNotCarried`, `apiKeyAdvancedWalletUnsupported`, `apiKeyOrganisationWalletScopeRequired`, `grantCapExceeded`, `amountAboveMaximum`, `amountBelowMinimum`, `amountUnreadable`, `amountsUnreadable`, `askFirst`, `authorityUnavailable`, `automationNeverAsks`, `availabilityUnreadable`, `backgroundNeverAsks`, `balanceUnreadable`, `defaultsUnavailable`, `walletHasNoAddress`, `walletUnavailable`, `bondAmountUnreadable`, `bondAssetUnreadable`, `catalogueUnavailable`, `chainFamilyUnknown`, `chainUnrecorded`, `clientSessionRequired`, `clockUnreadable`, `comingSoon`, `connectionChanged`, `connectionRevoked`, `corridorInvalid`, `credential`, `deadlineExceeded`, `defaultsLoading`, `deliverToCalldataUnsupported`, `deliverToTagUnsupported`, `deliverToNotPermitted`, `deliverToUnreadable`, `tradingPermissionRequired`, `directPatienceHarvest`, `economicallyInferior`, `exactAmountConflictsWithCard`, `exactAmountConflictsWithQuote`, `exactOutputDeliveryUnsupported`, `exactOutputEstimateUnavailable`, `exactRouteHypothesisUnavailable`, `expiredOnArrival`, `expiryUnknown`, `feeUnreadable`, `filteredOut`, `firmAskRefused`, `freshnessUnknown`, `fundingWindow`, `insufficientLiquidity`, `venueRelationship`, `venueRelationshipUnavailable`, `lpUnknown`, `mfaEnrolmentRequired`, `mfaRequired`, `minimumUnverified`, `mixedNetworks`, `netReceivedUnavailable`, `networkUnrecorded`, `noAddress`, `noCard`, `noFetcher`, `noInventory`, `noLaneForPair`, `noLegs`, `noOnChainCorridor`, `noPlannedVenue`, `noQuote`, `noRpc`, `notConnected`, `notEligible`, `notExecutable`, `orderPayloadMissing`, `outsideTopComposites`, `pairUnmapped`, `sellChainInvalid`, `permissionsUnreadable`, `placeOrderNotPermitted`, `prefundingMarkerUnreadable`, `prefundingRequired`, `indicative`, `priceOnRequest`, `priceOutOfRange`, `priceProtectionInvalid`, `pricingBookOnly`, `productNotQuoted`, `protocolChainMissing`, `providerFeeTreatmentUnknown`, `providerSiteUnrecorded`, `quoteIdUnissuable`, `quoteNotHeld`, `buyChainInvalid`, `buyAmountUnsupported`, `exactOutputDebitUnavailable`, `pairNotServed`, `receiveWalletNotServed`, `referenceMidUnreadable`, `referencePriceUnavailable`, `registryUnavailable`, `releaseRecheckUnavailable`, `requestUnbuildable`, `routeLegChainUnknown`, `routeLegUnnamed`, `routeLegUnplanned`, `routeUnavailable`, `secondFactorUnreadable`, `shortfallUnmeasured`, `shortfallUnreadable`, `singleChainVenue`, `siteChainUnreadable`, `sizeNotEligible`, `submitOrderBlocked`, `takerOnboardingIncomplete`, `tierNotQuoted`, `tradePaused`, `unsupportedNative`, `venueConnectionStorageUnavailable`, `venueDataStale`, `venueDeclined`, `venueNotConnected`, `venueNotEnabledForWorkspace`, `venueNotListed`, `venueTradeKeyUnavailable`, `venueTradeScopeRequired`, `venueTradeUnreadable`, `venueUnavailable`, `walletRefused`, `withdrawalFeeUnread`, `acrossRoutedViaCctp`, `apiKeyOrganisationWalletNotAllowlisted`, `balanceAvailabilityUnconfirmed`, `bankDestinationUnavailable`, `bebopJamKeyNotEnabled`, `bebopJamQuoteDeclined`, `bebopTokenUnavailable`, `relayCurrencyUnsupported`, `relaySwapImpactTooHigh`, `tetrafiSolverCallbackNotAuthorized`, `tradingLinkSnapshotChanged`, `tradingLinkSnapshotUnavailable`, `uniswapChainReadUnavailable`, `uniswapInsufficientDepth`, `uniswapQuoteUnreadable`, `uniswapUnwrapAboveDailyCap`, `uniswapUnwrapAboveTradeCap`, `uniswapRouteNotGranted`, `venueNotEnabled`, `askLimitReached`, `balanceMeaningUnconfirmed`, `bebopJamWalletUnsupported`, `bebopQuorumWalletTooSlow`, `bebopWalletQuorumUnreadable`, `connectionNotConfigured`, `deliveryAccountNetworkUnavailable`, `deliveryAccountUnavailable`, `destinationCannotSendOnChain`, `dexReferencePriceUnavailable`, `firmQuoteLimited`, `fundingAccountNetworkUnavailable`, `fundingAccountUnavailable`, `insufficientDepth`, `missingPermission`, `needsNativeGas`, `needsWallet`, `notPriced`, `payInTermsUnavailable`, `pilotTradeCapExceeded`, `platformFeeRateUnavailable`, `pricingBookPairUnserved`, `settlementDeclarationUnavailable`, `settlementNotAvailable`, `timedOut`, `timedOutBeforeSend`, `tradingSourceNetworkUnavailable`, `tradingSourceNotLinked`, `venueEnablementRechecking`, `venueEnablementUnavailable`, `venueListingTimedOut`, `venuePoliciesUnavailable`.\n\nNew values may be added; treat unknown values as other.", "type": "string" } }, "required": [ "reason", "kind" ], "type": "object" } ], "x-extensible-enum": true }, "VenueFillFilter": { "description": "Exact recorded account selectors. Null axes remain unrestricted; no name,\ncase or request-direction normalization changes the selected population.", "properties": { "executionTypeId": { "description": "The selected execution type; null for an unrestricted axis.", "type": [ "string", "null" ] }, "inputAsset": { "type": [ "string", "null" ] }, "outputAsset": { "type": [ "string", "null" ] }, "providerSite": { "type": [ "string", "null" ] } }, "required": [ "executionTypeId", "providerSite", "inputAsset", "outputAsset" ], "type": "object" }, "VenueFillQuantityGroup": { "description": "Currency identity remains venue/site scoped; different pairs are never netted together.", "properties": { "executionTypeId": { "description": "The execution type whose recorded quantities are grouped.", "type": "string" }, "filledRequestCount": { "format": "int64", "minimum": 0, "type": "integer" }, "inputAmount": { "type": "string" }, "inputAsset": { "type": "string" }, "outputAmount": { "type": "string" }, "outputAsset": { "type": "string" }, "providerSite": { "type": "string" } }, "required": [ "executionTypeId", "providerSite", "inputAsset", "outputAsset", "filledRequestCount", "inputAmount", "outputAmount" ], "type": "object" }, "VenueFillSummary": { "description": "Exact reported amounts across matched completed requests, not settlement or valuation.", "properties": { "amountUnit": { "type": "string" }, "candidateLimit": { "description": "Source requests admitted before the lifecycle filter; an exceeded cap refuses the read.", "format": "int32", "minimum": 0, "type": "integer" }, "filledRequestCount": { "format": "int64", "minimum": 0, "type": "integer" }, "groups": { "items": { "$ref": "#/components/schemas/VenueFillQuantityGroup" }, "type": "array" }, "source": { "$ref": "#/components/schemas/FillSource" } }, "required": [ "source", "amountUnit", "candidateLimit", "filledRequestCount", "groups" ], "type": "object" }, "VenueFilter": { "additionalProperties": false, "description": "Venue ids to keep or drop; each must be a known venue (`UNKNOWN_VENUE`).", "properties": { "exclude": { "items": { "type": "string" }, "type": "array" }, "include": { "items": { "type": "string" }, "type": "array" } }, "type": "object" }, "VenueModality": { "description": "A venue's modality, from its declaration. The one owner of this\nconcept: quote request and response types reuse it.\n\nNew values may be added; treat unknown values as other.", "enum": [ "amm", "solver", "bridge", "rfq", "orderBook", "fiat" ], "type": "string", "x-extensible-enum": true }, "VenueQuoteReviewDisposition": { "description": "Initial policy verdict retained on a preparation.\n\nNew values may be added; treat unknown values as other.", "enum": [ "review_required", "review_not_required" ], "type": "string", "x-extensible-enum": true }, "VenueRfqLimitUnit": { "description": "New values may be added; treat unknown values as other.", "oneOf": [ { "properties": { "asset": { "type": "string" }, "kind": { "description": "New values may be added; treat unknown values as other.", "enum": [ "asset" ], "type": "string", "x-extensible-enum": true } }, "required": [ "asset", "kind" ], "type": "object" }, { "properties": { "kind": { "description": "New values may be added; treat unknown values as other.", "enum": [ "usd" ], "type": "string", "x-extensible-enum": true } }, "required": [ "kind" ], "type": "object" } ], "x-extensible-enum": true }, "VenueRfqMechanismSizeLimits": { "properties": { "maximum": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/VenueRfqSizeLimit" } ] }, "minimum": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/VenueRfqSizeLimit" } ] }, "tag": { "type": "string" } }, "required": [ "tag" ], "type": "object" }, "VenueRfqQuoteFee": { "properties": { "amount": { "type": "string" }, "asset": { "type": "string" } }, "required": [ "amount", "asset" ], "type": "object" }, "VenueRfqSizeLimit": { "properties": { "amount": { "type": "string" }, "unit": { "$ref": "#/components/schemas/VenueRfqLimitUnit" } }, "required": [ "amount", "unit" ], "type": "object" }, "VenueRfqSizeObservation": { "description": "The native size read used for this request, not current trade authority.", "properties": { "fixedAmount": { "$ref": "#/components/schemas/FixedAmount", "description": "The request amount these limits bound, named by its request key." }, "read": { "$ref": "#/components/schemas/VenueRfqSizeRead" } }, "required": [ "fixedAmount", "read" ], "type": "object" }, "VenueRfqSizeRead": { "description": "New values may be added; treat unknown values as other.", "oneOf": [ { "properties": { "bands": { "description": "Exact mechanism union; outer bounds never fill a gap between bands.", "items": { "$ref": "#/components/schemas/VenueRfqMechanismSizeLimits" }, "type": "array" }, "maximum": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/VenueRfqSizeLimit" } ] }, "minimum": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/VenueRfqSizeLimit" } ] }, "observedAt": { "description": "Conservative lower bound on when the provider limits were read.", "format": "date-time", "type": "string" }, "pairRefusal": { "type": [ "string", "null" ] }, "status": { "description": "New values may be added; treat unknown values as other.", "enum": [ "observed" ], "type": "string", "x-extensible-enum": true } }, "required": [ "observedAt", "bands", "status" ], "type": "object" }, { "properties": { "code": { "type": "string" }, "status": { "description": "New values may be added; treat unknown values as other.", "enum": [ "unavailable" ], "type": "string", "x-extensible-enum": true } }, "required": [ "code", "status" ], "type": "object" } ], "x-extensible-enum": true }, "VenueSiteLabel": { "description": "Whether the connection's recorded site is the venue's sandbox/testnet or production.\n\nNew values may be added; treat unknown values as other.", "enum": [ "sandbox", "production" ], "type": "string", "x-extensible-enum": true }, "VenueTradeAmountBasis": { "description": "Which amount a venue trade row's `amountUsd` values.\n\nNew values may be added; treat unknown values as other.", "enum": [ "executed", "requested" ], "type": "string", "x-extensible-enum": true }, "VenueTradeDispatch": { "description": "The claimed venue submission and its recorded result. venueOrderId is the venue's native order identifier. Amounts are decimal currency units in the trade's debit and receipt assets; absent amounts are unknown, never zero. Only the documented fields are part of the integrator contract; undocumented fields may be sent and must be ignored.", "properties": { "claimedAt": { "format": "date-time", "type": "string" }, "confirmationKey": { "format": "uuid", "type": "string" }, "confirmedQuoteId": { "format": "uuid", "type": "string" }, "inputSpent": { "type": [ "string", "null" ] }, "outcomeCode": { "description": "Stable sanitized classification, never an upstream response body.", "type": [ "string", "null" ] }, "outputReceived": { "type": [ "string", "null" ] }, "quotedOutput": { "description": "The confirmed quote's output, beside `outputReceived`: a fill below it but\nwithin the trade's minimum receipt is a normal fill (operator decision\n2026-10-22), shown as \"Received … (quoted …; within your minimum …)\".", "type": [ "string", "null" ] }, "updatedAt": { "format": "date-time", "type": "string" }, "venueOrderId": { "type": [ "string", "null" ] } }, "required": [ "claimedAt", "confirmationKey", "confirmedQuoteId", "updatedAt" ], "type": "object" }, "VenueTradeExecutionStatus": { "description": "A venue trade's execution status, in camelCase like the order `status` (`outcomeUnknown`).\n\nNew values may be added; treat unknown values as other.", "enum": [ "notSubmitted", "dispatching", "outcomeUnknown", "filled", "unfilled", "needsReview" ], "type": "string", "x-extensible-enum": true }, "VenueTradeFeeBoundDto": { "properties": { "asset": { "type": "string" }, "maximumAmount": { "type": "string" } }, "required": [ "asset", "maximumAmount" ], "type": "object" }, "VenueTradeFeeReport": { "description": "What the native trade record carried in its own fee field when the fee is\nincluded in the price. `not_reported` is an absent field, never a zero fee.\n\nNew values may be added; treat unknown values as other.", "enum": [ "not_reported", "reported" ], "type": "string", "x-extensible-enum": true }, "VenueTradeFeeTreatment": { "description": "How a fill's fee is known. `not_qualified` means the venue driver does not\nyet classify fee reporting: it is neither a zero fee nor \"not reported\".\n\nNew values may be added; treat unknown values as other.", "enum": [ "included_in_price", "reported", "separate_charges", "not_qualified" ], "type": "string", "x-extensible-enum": true }, "VenueTradeFillFee": { "properties": { "amount": { "description": "Exact decimal, present when the venue reported a fee amount.", "type": [ "string", "null" ] }, "asset": { "description": "Present exactly when `amount` is.", "type": [ "string", "null" ] }, "basis": { "description": "The venue contract clause, present only when the fee is in the price.", "type": [ "string", "null" ] }, "lines": { "description": "Separate native charges, positive for a fee and negative for a rebate.\nOutcome amounts already include them in their respective assets.", "items": { "$ref": "#/components/schemas/VenueRfqQuoteFee" }, "type": [ "array", "null" ] }, "tradeFeeReport": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/VenueTradeFeeReport", "description": "Present only when the fee is in the price." } ] }, "treatment": { "$ref": "#/components/schemas/VenueTradeFeeTreatment" } }, "required": [ "treatment" ], "type": "object" }, "VenueTradeFinancials": { "description": "A venue trade's recorded money terms. Each field is a stored fact or absent; an absent fact is never zero.", "properties": { "fee": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/VenueTradeFillFee", "description": "The venue's fee as recorded with the fill; absent before a fill." } ] }, "legs": { "description": "Its payment legs (bank payout, pay-in, wallet payout), as the order page reads them:\nrail, state, payout breakdown and a destination reference, never bank coordinates.", "items": { "$ref": "#/components/schemas/TradeLegFacts" }, "type": "array" }, "quotedOutput": { "description": "The confirmed quote's output, beside what was received.", "type": [ "string", "null" ] } }, "type": "object" }, "VenueTradeFunding": { "description": "How a Confirm on a pair with a fiat bank side is funded.", "enum": [ "balance", "depositFirst" ], "type": "string" }, "VenueTradeHistoryLeg": { "description": "One leg of a venue trade in the trade history, named sell or buy as in POST /quotes. amount is the consented bound in exact decimal units of asset (on sell the most spent, on buy the least received); absent when not recorded, never zero.", "properties": { "amount": { "description": "The consented bound in exact decimal units of `asset`: on `sell` the most the trade may\nspend, on `buy` the least it must receive. Absent when not recorded, never `0`.", "type": [ "string", "null" ] }, "asset": { "type": "string" } }, "required": [ "asset" ], "type": "object" }, "VenueTradeNotSentReason": { "description": "Why a claimed trade was proven not sent. An unclassified cause is NOT_SENT_UNCLASSIFIED, never free text.\n\nNew values may be added; treat unknown values as other.", "enum": [ "QUOTE_RECONFIRMATION_REQUIRED", "VENUE_ACCEPT_ADMISSION_REFUSED", "VENUE_SESSION_ACQUIRE_TIMEOUT", "VENUE_GRID_CHANGED", "VENUE_GRID_UNREADABLE", "VENUE_REFUSED_BEFORE_ACCEPTANCE", "LP_TRADING_REFUSED_UNSENT", "COMPLIANCE_AUDIT_UNRECORDED", "ON_CHAIN_UNSENT", "BOOK_SELL_LIMIT_UNREPRESENTABLE", "VENUE_DISPATCH_AUTHORITY_UNAVAILABLE", "BOOK_PLACEMENT_PRICE_UNRECORDED_UNSENT", "VENUE_ORDER_ABSENT_PAST_HORIZON", "VENUE_REQUEST_REFUSED_UNSENT", "NOT_SENT_UNCLASSIFIED" ], "type": "string", "x-extensible-enum": true }, "VenueTradeOperation": { "description": "A prepared or placed Basic venue trade. Track it by operationId and connectionId; executionStatus describes the trade and settlementStatus describes any subsequent money movement. initialReviewDisposition is the original planning verdict, not current approval. Only the documented fields are part of the integrator contract; undocumented fields may be sent and must be ignored.", "properties": { "bounds": { "$ref": "#/components/schemas/VenueTradeReviewBoundsDto" }, "connectionId": { "format": "uuid", "type": "string" }, "createdAt": { "format": "date-time", "type": "string" }, "dispatch": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/VenueTradeDispatch" } ] }, "executionStatus": { "$ref": "#/components/schemas/VenueTradeExecutionStatus" }, "executionTypeId": { "description": "The execution type (compiled spec id), not the catalogue Venue.", "type": "string" }, "initialReviewDisposition": { "$ref": "#/components/schemas/VenueQuoteReviewDisposition", "description": "The original planning verdict; current review/policy must be reassessed." }, "label": { "type": "string" }, "operationId": { "format": "uuid", "type": "string" }, "providerClientOrderId": { "description": "The client order id TetraFi sent the venue, once a dispatch was claimed.", "type": [ "string", "null" ] }, "providerSite": { "type": "string" }, "quoteExpiresAt": { "description": "Present exactly when `quote_id` is.", "format": "date-time", "type": [ "string", "null" ] }, "quoteId": { "description": "The quote bound at preparation, only on deprecated quote-bound\npreparations. Absent on bounds-first ones; the executed quote is always\n`dispatch.confirmed_quote_id`.", "format": "uuid", "type": [ "string", "null" ] }, "quoteRequestId": { "description": "The quote request the trade was ordered from (`rq_…`), when it was ordered through\nthe quote set.", "type": [ "string", "null" ] }, "requestKey": { "format": "uuid", "type": "string" }, "requestedDeadline": { "format": "date-time", "type": [ "string", "null" ] }, "reviewRequestId": { "format": "uuid", "type": [ "string", "null" ] }, "settlementStatus": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/VenueTradeSettlementStatus", "description": "The legs' settlement; `null` when the order has no legs. Always present." } ] }, "venueFilledAt": { "description": "When the venue reports the fill happened, when it reported one.", "format": "date-time", "type": [ "string", "null" ] }, "workspaceId": { "type": "string" } }, "required": [ "bounds", "connectionId", "createdAt", "executionStatus", "executionTypeId", "initialReviewDisposition", "label", "operationId", "providerSite", "requestKey", "workspaceId" ], "type": "object" }, "VenueTradePlacedBy": { "description": "Who placed a venue trade, as named on its order read and trade history.\n\nNew values may be added; treat unknown values as other.", "oneOf": [ { "description": "A workspace member; `name` is first and last name, else the email.", "properties": { "kind": { "description": "New values may be added; treat unknown values as other.", "enum": [ "member" ], "type": "string", "x-extensible-enum": true }, "name": { "type": "string" }, "userId": { "type": "string" } }, "required": [ "userId", "name", "kind" ], "type": "object" }, { "description": "An API key; `name` is its label, absent when the key has none.", "properties": { "keyId": { "type": "string" }, "kind": { "description": "New values may be added; treat unknown values as other.", "enum": [ "apiKey" ], "type": "string", "x-extensible-enum": true }, "name": { "type": [ "string", "null" ] } }, "required": [ "keyId", "kind" ], "type": "object" } ], "x-extensible-enum": true }, "VenueTradePriceBasis": { "description": "New values may be added; treat unknown values as other.", "enum": [ "market_convention", "receipt_per_debit" ], "type": "string", "x-extensible-enum": true }, "VenueTradePriceUnit": { "description": "Unit of a price: `quoteAsset / baseAsset` means one base asset costs this many quote assets.", "properties": { "baseAsset": { "type": "string" }, "quoteAsset": { "type": "string" } }, "required": [ "baseAsset", "quoteAsset" ], "type": "object" }, "VenueTradeReviewBoundsDto": { "description": "A venue trade's bounds on the wire, in the `POST /quotes` vocabulary: what the trade\nsells and buys. Exact decimal currency units.", "properties": { "buy": { "$ref": "#/components/schemas/TradeLeg", "description": "The Asset bought; `amount` is the least the trade delivers, net of fees deducted from it." }, "buyAmount": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/DecimalAmount", "description": "The exact amount bought, when the trader fixed what they receive." } ] }, "maximumFees": { "description": "An absent asset is not permission to charge an unbounded fee in it.", "items": { "$ref": "#/components/schemas/VenueTradeFeeBoundDto" }, "type": "array" }, "sell": { "$ref": "#/components/schemas/TradeLeg", "description": "The Asset sold; `amount` is the most the trade spends, every fee charged in it included." }, "sellAmount": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/DecimalAmount", "description": "The exact amount sold, when the trader fixed what they sell. At most one of\n`sellAmount` and `buyAmount`; both are absent on an older trade that recorded neither." } ] } }, "required": [ "sell", "buy", "maximumFees" ], "type": "object" }, "VenueTradeSettlementStatus": { "description": "Where the order's money movement stands. executionStatus describes the trade, not settlement; settled means every money-movement leg has settled.\n\nNew values may be added; treat unknown values as other.", "enum": [ "inProgress", "settled", "endedUnsettled" ], "type": "string", "x-extensible-enum": true }, "VenueTradeStatedPrice": { "allOf": [ { "$ref": "#/components/schemas/VenueTradePriceUnit" }, { "properties": { "basis": { "$ref": "#/components/schemas/VenueTradePriceBasis" }, "value": { "type": "string" } }, "required": [ "value", "basis" ], "type": "object" } ], "description": "Confirmed quote-asset units per one base asset; not a venue quote or an indicative price." }, "WalletAttestationEntry": { "description": "A linked wallet's address and ACE identity-registration status.", "properties": { "address": { "type": "string" }, "attestationStatus": { "$ref": "#/components/schemas/AttestationStatus" }, "verified": { "type": "boolean" } }, "required": [ "address", "verified", "attestationStatus" ], "type": "object" }, "WalletAuthorizationKind": { "description": "New values may be added; treat unknown values as other.", "enum": [ "turnkeyOwnerProof", "privyAuthorization" ], "type": "string", "x-extensible-enum": true }, "WalletInfraProvider": { "description": "Wallet-infrastructure providers selectable by a workspace.\n\nNew values may be added; treat unknown values as other.", "enum": [ "privy", "turnkey", "lit" ], "type": "string", "x-extensible-enum": true }, "WalletLinkRecovery": { "description": "Recovery for an explicitly chosen organisation wallet not linked to a Basic account.", "properties": { "defaultWallets": { "additionalProperties": { "type": "string" }, "description": "Per CAIP-2 chain, the account's default wallets (target ids): a per-request switch the\ncaller sends as its pay-from preference, never a persistent preference write.", "propertyNames": { "description": "A CAIP-2 chain id (`eip155:8453`, `solana:`, `tron:shasta`), syntax-checked:\na namespace of 3 to 8 lowercase letters, digits or `-`, and a reference of 1 to 32\nletters, digits, `-` or `_`. Compared exactly, as CAIP-2 references are case-sensitive.", "example": "eip155:8453", "type": "string" }, "type": [ "object", "null" ] }, "linkHref": { "type": "string" }, "wallet": { "$ref": "#/components/schemas/BindingTargetView" } }, "required": [ "wallet", "linkHref" ], "type": "object" }, "WalletSigningPreparation": { "description": "What the wallet's provider needs signed or approved for an exact digest TetraFi\nprepared. Hosted approval returns an original authorizationId for the owner to approve\nbefore order submission. Other providers use an operation-bound RPC factor\nin the existing execution.signing request fields.", "properties": { "authorizationId": { "description": "Original hosted authorization retained by preflight. Submit owner proof\nthere, then pass this identity to the existing order signing selection.", "type": [ "string", "null" ] }, "authorizationKind": { "$ref": "#/components/schemas/WalletAuthorizationKind" }, "authorizationPayload": { "description": "The exact activity to stamp, as the provider encodes it, or the provider's\ncanonical payload." }, "expiresAt": { "format": "date-time", "type": "string" }, "provider": { "$ref": "#/components/schemas/WalletInfraProvider" }, "providerBody": { "description": "Exact reviewed native bytes. Hosted approval retains these under its\nauthorizationId; only an inline RPC factor copies them into providerBody.", "type": [ "string", "null" ] }, "requestExpiryMs": { "description": "Copy unchanged into execution.signing.requestExpiryMs when present.", "format": "int64", "type": [ "integer", "null" ] }, "signingDigest": { "type": "string" }, "walletId": { "description": "Stable TetraFi registry wallet identity, never a provider-native fallback.", "type": "string" } }, "required": [ "walletId", "provider", "authorizationKind", "authorizationPayload", "expiresAt", "signingDigest" ], "type": "object" }, "WebhookConfig": { "description": "A webhook configuration for a workspace.", "properties": { "active": { "type": "boolean" }, "consecutiveFailures": { "description": "Count of consecutive full-retry-schedule failures. Reset to 0 on any\nsuccessful delivery. Reaching 5 pauses the subscription.", "format": "int32", "type": "integer" }, "createdAt": { "format": "date-time", "type": "string" }, "events": { "items": { "$ref": "#/components/schemas/WebhookEventType" }, "type": "array" }, "id": { "type": "string" }, "pausedAt": { "description": "Set when the subscription is auto-paused after persistent delivery\nfailure. Cleared when the subscription is reactivated.", "format": "date-time", "type": [ "string", "null" ] }, "updatedAt": { "format": "date-time", "type": "string" }, "url": { "type": "string" }, "workspaceId": { "type": "string" } }, "required": [ "id", "workspaceId", "url", "events", "active", "createdAt", "updatedAt" ], "type": "object" }, "WebhookConfigView": { "allOf": [ { "$ref": "#/components/schemas/WebhookConfig" }, { "properties": { "lastDelivery": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/WebhookDeliverySummary" } ] }, "principalStatus": { "$ref": "#/components/schemas/WebhookPrincipalStatus" } }, "required": [ "principalStatus" ], "type": "object" } ], "description": "Webhook read response with the newest process-local delivery fact." }, "WebhookDelivery": { "description": "A delivery log entry for a webhook invocation.", "properties": { "attempt": { "format": "int32", "minimum": 0, "type": "integer" }, "deliveredAt": { "format": "date-time", "type": "string" }, "errorMessage": { "type": [ "string", "null" ] }, "eventType": { "$ref": "#/components/schemas/WebhookEventType" }, "id": { "format": "uuid", "type": "string" }, "payload": { "description": "Fiat payload example captured live from a persisted bank-deposit event (rfq 2ef31a1ea),\nnot a delivery receipt. References retain the API's masks exactly." }, "redeliverAvailable": { "description": "Actual retained availability, not permission to resend; redelivery revalidates.", "type": [ "boolean", "null" ] }, "redeliveryOf": { "format": "uuid", "type": [ "string", "null" ] }, "statusCode": { "format": "int32", "minimum": 0, "type": [ "integer", "null" ] }, "success": { "type": "boolean" }, "test": { "type": "boolean" }, "webhookId": { "type": "string" } }, "required": [ "id", "webhookId", "eventType", "success", "attempt", "deliveredAt" ], "type": "object" }, "WebhookDeliveryRetention": { "description": "Delivery logs are bounded and disappear when this server process restarts.", "properties": { "capacity": { "format": "int32", "minimum": 0, "type": "integer" }, "scope": { "type": "string" } }, "required": [ "scope", "capacity" ], "type": "object" }, "WebhookDeliverySummary": { "description": "Summary of the newest retained delivery attempt.", "properties": { "at": { "format": "date-time", "type": "string" }, "statusCode": { "format": "int32", "minimum": 0, "type": [ "integer", "null" ] }, "success": { "type": "boolean" }, "test": { "type": "boolean" } }, "required": [ "at", "success", "test" ], "type": "object" }, "WebhookEventType": { "description": "New values may be added; treat unknown values as other.", "enum": [ "treasury.payout.awaiting_approval", "treasury.payout.completed", "treasury.payout.failed", "treasury.payout.cancelled", "treasury.fiat_leg.planned", "treasury.fiat_leg.awaiting_approval", "treasury.fiat_leg.payout_held", "treasury.fiat_leg.dispatching", "treasury.fiat_leg.uncertain", "treasury.fiat_leg.in_transit", "treasury.fiat_leg.held_by_provider", "treasury.fiat_leg.overdue", "treasury.fiat_leg.manual_review", "treasury.fiat_leg.settled", "treasury.fiat_leg.returned", "treasury.fiat_leg.returned_after_settlement", "treasury.fiat_leg.refunding", "treasury.fiat_leg.refunded", "treasury.fiat_leg.cancelled", "treasury.fiat_leg.refused", "treasury.bank_deposit.declared", "treasury.bank_deposit.overdue", "treasury.bank_deposit.manual_review", "treasury.bank_deposit.credited", "treasury.bank_deposit.withdrawn_by_user", "treasury.bank_deposit.history_unreadable", "treasury.bank_deposit.history_recovered", "treasury.fiat_leg.awaiting_funds", "treasury.fiat_leg.funds_received", "treasury.fiat_leg.price_beyond_bound", "treasury.fiat_leg.expired_unfunded", "treasury.fiat_leg.late_funds", "treasury.transfer.submitted", "treasury.transfer.awaiting_approval", "treasury.transfer.rejected", "treasury.transfer.completed", "treasury.transfer.failed", "treasury.transfer.cancelled", "treasury.transfer.custodian_approval_relayed", "treasury.transfer.expired", "treasury.transfer.replaced", "treasury.transfer.confirmation_threshold_set", "treasury.run.draft", "treasury.run.waiting_for_funds", "treasury.run.awaiting_approval", "treasury.run.ready", "treasury.run.running", "treasury.run.waiting", "treasury.run.reconciling", "treasury.run.needs_review", "treasury.run.paused", "treasury.run.succeeded", "treasury.run.partially_succeeded", "treasury.run.failed", "treasury.run.recovering", "treasury.run.recovered", "treasury.run.cancelled", "treasury.step.pending", "treasury.step.ready", "treasury.step.dispatching", "treasury.step.waiting", "treasury.step.reconciling", "treasury.step.needs_review", "treasury.step.paused", "treasury.step.succeeded", "treasury.step.partially_succeeded", "treasury.step.failed", "treasury.step.cancelled", "treasury.step.custodian_cancel_requested", "treasury.step.confirmation_threshold_set", "treasury.step.custodian_approval_relayed", "treasury.step.custodian_cancel_overridden", "treasury.approval.requested", "treasury.approval.expiring", "treasury.approval.approved", "treasury.approval.denied", "treasury.approval.expired", "treasury.destination.retired", "treasury.address_book.destination_revoked", "treasury.workspace.frozen", "treasury.vault.frozen", "treasury.custodian.frozen", "treasury.balance.low", "treasury.balance.recovered", "treasury.statement.ready", "treasury.automation.created", "treasury.automation.updated", "treasury.automation.activated", "treasury.automation.returned_to_review", "treasury.automation.paused", "treasury.automation.resumed", "treasury.automation.archived", "treasury.agent.envelope.created", "treasury.agent.envelope.updated", "treasury.agent.kill_switch.activated", "treasury.agent.session_signer.granted", "treasury.agent.session_signer.revoked", "treasury.agent.sponsor.changed", "treasury.agent.rebalancer.run", "treasury.agent.payment.authorized", "treasury.agent.payment.settled", "treasury.agent.payment.refused", "treasury.agent.payment.received", "order.updated", "settlement.failed", "settlement.retried", "settlement.disputed", "member.invited", "member.joined", "member.added", "member.removed", "api_key.rotated", "api_key.revoked", "api_key.expiring_soon", "lp.enabled", "lp.disabled", "lp.sla_breach", "kyb.expiring", "kyb.expired", "kyb.renewed", "kyc.expiring", "compliance.sanctions.flag_added", "compliance.event", "credit.updated", "affiliation.invited", "affiliation.accepted", "affiliation.revoked", "bilateral.requested", "bilateral.accepted", "direct_user.created", "direct_user.updated", "direct_user.invited", "direct_user.suspended", "direct_user.verification.pending", "direct_user.verification.verified", "direct_user.verification.rejected", "wallet.session_signer.granted", "wallet.session_signer.revoked", "webhook.subscription.paused", "webhook.test" ], "type": "string", "x-extensible-enum": true }, "WebhookPrincipalStatus": { "description": "Whether an endpoint has an accountable principal. An `unbound` endpoint was\ncreated before principals were recorded: its order and treasury events are\nwithheld (recorded `no_principal`) until an update of its url or events makes\nthe updater its principal.\n\nNew values may be added; treat unknown values as other.", "enum": [ "bound", "unbound" ], "type": "string", "x-extensible-enum": true }, "WindowSettlementBasis": { "description": "What completes a window's settlement. `clock`: the occurrence's confirmed completion time\n(`settlesBy`). `onAgreement`: the LP issues the window's statement and the trade settles\nonce that statement is agreed (Keyrock), so the window states no clock time.\n\nNew values may be added; treat unknown values as other.", "enum": [ "clock", "onAgreement" ], "type": "string", "x-extensible-enum": true }, "WorkspaceCapabilitiesResponse": { "description": "What the workspace can do now, as the API enforces it. capabilities holds one decision per capability: allowed, or blocked with each blocker's code, the step that clears it (unlockStep), an estimate and the items still due. The quote and order routes apply the same decision and refuse with CAPABILITY_BLOCKED and the same blockers in details.capabilityBlockers.", "properties": { "account": { "$ref": "#/components/schemas/AccountReadiness" }, "capabilities": { "additionalProperties": { "$ref": "#/components/schemas/CapabilityDecision" }, "propertyNames": { "description": "A capability: view_indicative_quotes, request_quotes (firm quotes), submit_order, establish_counterparty_relationship, onboard_direct_users, execute_value_movement, create_signing_authority, provision_wallet or activate_solver. Viewing never blocks on verification; acting does.\n\nNew values may be added; treat unknown values as other.", "enum": [ "view_indicative_quotes", "request_quotes", "submit_order", "establish_counterparty_relationship", "onboard_direct_users", "execute_value_movement", "create_signing_authority", "provision_wallet", "activate_solver" ], "type": "string", "x-extensible-enum": true }, "type": "object" }, "informationNeeded": { "description": "The LPs this workspace has a relationship with whose enforced serving\nrequirements find a fact it has not recorded, with the onboarding items\nthat supply it. Advisory, never a blocker. `null` when the requirements\ncould not be read; an empty list when nothing is needed.", "items": { "$ref": "#/components/schemas/LpInformationNeeded" }, "type": [ "array", "null" ] }, "lifecycle": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/WorkspaceLifecycleState", "description": "Where the workspace stands, as the gates read it: onboarding, active, suspended, deactivated or archived." } ] }, "platformStatus": { "$ref": "#/components/schemas/PlatformStatus" }, "screening": { "$ref": "#/components/schemas/ScreeningReadiness", "description": "The environment's screening sources, so a client can tell whether a screened claim is a real sanctions check." }, "workspace": { "$ref": "#/components/schemas/WorkspaceReadiness" }, "workspaceId": { "type": "string" }, "workspaceType": { "$ref": "#/components/schemas/WorkspaceType" } }, "required": [ "workspaceId", "workspaceType", "platformStatus", "account", "workspace", "screening", "capabilities" ], "type": "object" }, "WorkspaceLifecycleState": { "description": "The workspace lifecycle, derived from its platform status and any suspension cause.\n\nNew values may be added; treat unknown values as other.", "enum": [ "onboarding", "active", "suspended", "deactivated", "archived" ], "type": "string", "x-extensible-enum": true }, "WorkspacePermission": { "description": "Granular workspace permissions.\n\nResolved via `permissions_for(ws_type, role)` — the same role\nunlocks different capabilities depending on the workspace type.\n\nNew values may be added; treat unknown values as other.", "enum": [ "request_quotes", "place_order", "view_orders", "view_flow_analytics", "view_settlements", "manage_team", "manage_access", "manage_credentials", "manage_webhooks", "manage_security_policy", "manage_treasury_policy", "manage_workspace_profile", "view_compliance", "view_person_pii", "modify_compliance", "connect_reporting", "view_credit", "modify_credit", "view_wallets", "manage_wallets", "request_treasury_transfers", "approve_treasury_transfers", "approve_venue_trades", "manage_lp_scoping", "manage_sub_workspaces", "manage_affiliations", "onboard_external_users", "approve_client_kyc", "manage_bilateral", "view_bilateral_documents", "manage_settlements", "manage_solvers", "view_solver_operations", "protocol_admin", "approve_onboarding", "manage_promotions", "manage_market_intelligence", "view_umbrella_compliance", "manage_umbrella_users", "manage_cases", "view_reports", "file_reports" ], "type": "string", "x-extensible-enum": true }, "WorkspaceReadiness": { "description": "The workspace's own verification. No workspace type needs TetraFi KYB to trade, and KYB blocks no capability. kybStatus is its effective KYB state, kept as profile information: not_started, pending, in_review, approved, rejected, expired, or unavailable when it could not be read; new values may be added.", "properties": { "kybRecord": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/KybRecordObservation", "description": "Permission-filtered KYB record facts; absent only from an older server." } ] }, "kybStatus": { "type": "string" }, "nameScreening": { "$ref": "#/components/schemas/SanctionsScreeningState" } }, "required": [ "nameScreening", "kybStatus" ], "type": "object" }, "WorkspaceType": { "description": "The workspace type: direct_user, company, broker or lp.\n\nNew values may be added; treat unknown values as other.", "enum": [ "direct_user", "company", "broker", "lp" ], "type": "string", "x-extensible-enum": true }, "WorkspaceVenueMovement": { "description": "Which movement a workspace-venue route step makes at the LP account.\n\nNew values may be added; treat unknown values as other.", "enum": [ "trade", "withdrawal", "deposit" ], "type": "string", "x-extensible-enum": true } }, "securitySchemes": { "api_key": { "description": "Send the API key in `X-API-Key`.\n\n**Request signing.** A key with signing enabled (`POST /api/v1/workspaces/{workspaceId}/users/me/api-keys/{keyId}/signing`, which returns the signing secret once) must also sign every request:\n\n- `X-Timestamp`: the current Unix time in seconds, within 300 seconds of the server clock.\n- `X-Signature`: lower-case hex HMAC-SHA256 of the canonical string, keyed with the signing secret's 32 bytes (the secret is 64 hex characters; decode it first).\n\nThe canonical string is four lines joined by `\\n`, with no trailing newline: the `X-Timestamp` value, the upper-case method, the path with its query exactly as sent (`/api/v1/orders?limit=1`), and the lower-case hex SHA-256 of the exact body bytes (the SHA-256 of an empty body when there is none).\n\nA write's signature (POST, PUT, PATCH, DELETE) is accepted once: sending the same signed write again is refused, so a retry signs again. A read (GET, HEAD) changes nothing, so an identical signed read inside the window is admitted again and polling needs no nonce.\n\nA signing refusal is a 401 `AUTH_REQUIRED` whose `details.reason` names the cause: `SIGNATURE_REQUIRED` (a header is missing), `SIGNATURE_INVALID` (a malformed header or a wrong signature), `TIMESTAMP_OUT_OF_RANGE` or `SIGNATURE_REPLAYED`.", "in": "header", "name": "X-API-Key", "type": "apiKey", "x-request-signing": { "algorithm": "HMAC-SHA256", "canonicalRequest": [ "timestamp", "method", "pathWithQuery", "bodySha256Hex" ], "canonicalSeparator": "\n", "oneTimeMethods": [ "POST", "PUT", "PATCH", "DELETE" ], "refusal": { "error": "AUTH_REQUIRED", "reasons": [ "SIGNATURE_REQUIRED", "SIGNATURE_INVALID", "TIMESTAMP_OUT_OF_RANGE", "SIGNATURE_REPLAYED" ], "status": 401 }, "secretEncoding": "hex", "signatureEncoding": "hex-lower", "signatureHeader": "X-Signature", "timestampHeader": "X-Timestamp", "timestampWindowSeconds": 300 } }, "bearer_auth": { "bearerFormat": "JWT", "scheme": "bearer", "type": "http" } } }, "info": { "description": "TetraFi is an API for institutional trading across on-chain and off-chain venues: discover assets, request quotes, place an order by quote id and read its status. API keys sign every request.\n\nAsset-pair quotes: every tagged union is tagged by `kind`; only the outcome of `/prices` rows and `sources[]` entries is tagged by `status`.", "title": "TetraFi API", "version": "1.0.0-beta.1" }, "openapi": "3.1.0", "paths": { "/api/v1/assets": { "get": { "operationId": "get_assets", "parameters": [ { "$ref": "#/components/parameters/WorkspaceId" }, { "description": "Assets per page, 1 to 200. With only a `cursor`, the page size that cursor was issued with.", "in": "query", "name": "limit", "required": false, "schema": { "format": "int32", "minimum": 0, "type": "integer" } }, { "description": "The previous page's `nextCursor`. A cursor is valid while the listing it was issued for\nis unchanged; after a change it answers 409 `CURSOR_STALE`, and the walk starts again.", "in": "query", "name": "cursor", "required": false, "schema": { "type": "string" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/AssetsResponse" } } }, "description": "Workspace-eligible Assets with variants and CAIP-2 deployments. API keys require the prices_read scope.", "headers": { "etag": { "description": "Snapshot hash plus the eligibility set", "schema": { "type": "string" } }, "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "304": { "description": "Not modified (If-None-Match matched the ETag). Unpaged requests only: a page carries no ETag.", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "400": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "INVALID_CURSOR, or INVALID_REQUEST naming `limit` (1 to 200) or an unknown query parameter", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "401": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "Missing or invalid credentials", "headers": { "WWW-Authenticate": { "description": "Sent when the request presented a bearer token and it was refused: `Bearer error=\"invalid_token\"` (RFC 6750 section 3). Exchange a new token. A refused API key carries no challenge.", "schema": { "type": "string" } }, "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "403": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "Not a member of the workspace, or the API key lacks prices_read or belongs to another workspace", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "408": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "The request timed out before a response was ready.", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "409": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "CURSOR_STALE: the listing changed since the cursor was issued; start again without a cursor", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "429": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "Too many requests. Wait the number of seconds in `Retry-After` before retrying.", "headers": { "Retry-After": { "description": "Whole seconds to wait before retrying. Always sent on 429; sent on 503 when the wait is known. `details.retryAfter` carries the same wait as an ISO 8601 duration.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "500": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "Something went wrong on our side.", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "503": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "No registry catalogue is installed (ASSET_CATALOGUE_UNAVAILABLE)", "headers": { "Retry-After": { "description": "Whole seconds to wait before retrying. Always sent on 429; sent on 503 when the wait is known. `details.retryAfter` carries the same wait as an ISO 8601 duration.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } } }, "security": [ { "api_key": [] }, { "bearer_auth": [] } ], "summary": "`GET /api/v1/assets`: the Assets, variants and deployments the workspace can trade.", "tags": [ "trading" ] } }, "/api/v1/me": { "get": { "operationId": "get_introspection", "parameters": [ { "$ref": "#/components/parameters/WorkspaceId" }, { "description": "Comma-separated: profile, permissions, verification. An interactive session only, except permissions, which an API key's answer always carries", "in": "query", "name": "include", "required": false, "schema": { "type": "string" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/IntrospectionResponse" } } }, "description": "Presented JWT identity or API-key identity. A service account's bearer token (POST /api/v1/oauth/token) answers the identity of the key it was exchanged from, with auth oauthClientCredentials and only the scopes the token was issued, narrowed by the key's live rights. An unrestricted key returns the complete explicit scope list, intersected with live workspace IAM and qualifying native resource-read envelopes. TreasuryRead does not grant global Treasury visibility. A workspace key also reads its own organisation-wallet grants and signing state (organisationWallets). An interactive session is checked against its current account and session on every request; include adds its profile, permissions and verification.", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "400": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "INVALID_REQUEST naming the parameter", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "401": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "Authentication required, or INVALID_SESSION: the session was revoked or expired, or the account is suspended", "headers": { "WWW-Authenticate": { "description": "Sent when the request presented a bearer token and it was refused: `Bearer error=\"invalid_token\"` (RFC 6750 section 3). Exchange a new token. A refused API key carries no challenge.", "schema": { "type": "string" } }, "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "403": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "Current workspace membership required; MFA_REQUIRED for a session that has not completed its second factor; JWT_REQUIRED for include=profile or include=verification with an API key", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "408": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "The request timed out before a response was ready.", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "429": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "Too many requests. Wait the number of seconds in `Retry-After` before retrying.", "headers": { "Retry-After": { "description": "Whole seconds to wait before retrying. Always sent on 429; sent on 503 when the wait is known. `details.retryAfter` carries the same wait as an ISO 8601 duration.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "500": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "Something went wrong on our side.", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "503": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "Current workspace authority or session authority unavailable (SESSION_AUTHORITY_UNAVAILABLE, PROFILE_UNAVAILABLE), or API_KEY_ORGANISATION_WALLET_AUTHORITY_UNAVAILABLE when the key's organisation-wallet grants could not be read", "headers": { "Retry-After": { "description": "Whole seconds to wait before retrying. Always sent on 429; sent on 503 when the wait is known. `details.retryAfter` carries the same wait as an ISO 8601 duration.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } } }, "security": [ { "api_key": [] }, { "bearer_auth": [] } ], "summary": "GET /api/v1/me", "tags": [ "auth" ] } }, "/api/v1/oauth/token": { "post": { "description": "RFC 6749 client-credentials grant for active service accounts. Supply grant_type=client_credentials, client_id=, and client_secret=. Client credentials may instead be sent with HTTP Basic authentication. Tokens use the configured auth.jwtExpirySeconds capped at 900 seconds and carry the service account's current workspace role, effective permissions, and effective API scopes.", "operationId": "oauth_token", "requestBody": { "content": { "application/x-www-form-urlencoded": { "schema": { "$ref": "#/components/schemas/OAuthTokenRequest" } } }, "required": true }, "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/OAuthTokenResponse" } } }, "description": "Short-lived service-account bearer token" }, "400": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/OAuthErrorResponse" } } }, "description": "invalid_grant (no grant_type, or an unreadable form), unsupported_grant_type (a grant other than client_credentials), or unauthorized_client with error_uri naming SIGNED_KEY_NOT_EXCHANGEABLE (a key that requires request signing or holds venue trading signs each request instead)" }, "401": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/OAuthErrorResponse" } } }, "description": "invalid_client: the client id or secret is wrong, or the key is not an active service account's" }, "503": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/OAuthErrorResponse" } } }, "description": "temporarily_unavailable: the client's current authority could not be read; retry" } }, "security": [ {} ], "tags": [ "auth" ] } }, "/api/v1/orders": { "get": { "description": "Lists Basic and Advanced orders using the same envelope as GET /orders/{orderId}. Requires orders_read on an API key, or ViewOrders/PlaceOrder on a session. Newest first by created time and id. A status filter is applied to stored order facts first and then to each order's canonical public status; a filtered page keeps reading until it holds limit items or the orders end, within a bounded scan. A page shorter than limit carries a nextCursor only when that scan reached its limit, and then says so with scanLimitReached: follow nextCursor until null. A cursor is bound to the caller, workspace and exact filters; a malformed, foreign or deleted anchor is INVALID_CURSOR.", "operationId": "list_orders", "parameters": [ { "$ref": "#/components/parameters/WorkspaceId" }, { "description": "Number of matching items requested, 1–20; default 20.", "in": "query", "name": "limit", "required": false, "schema": { "format": "int32", "minimum": 0, "type": "integer" } }, { "description": "Opaque nextCursor from this caller, workspace and the identical filter set.", "in": "query", "name": "cursor", "required": false, "schema": { "type": "string" } }, { "description": "Public lifecycle status, shared by Basic and Advanced orders.", "in": "query", "name": "status", "required": false, "schema": { "$ref": "#/components/schemas/PublicOrderStatus" } }, { "in": "query", "name": "kind", "required": false, "schema": { "$ref": "#/components/schemas/OrderListKind" } }, { "description": "Created at or after this RFC 3339 instant, inclusive.", "in": "query", "name": "from", "required": false, "schema": { "format": "date-time", "type": "string" } }, { "description": "Created at or before this RFC 3339 instant, inclusive.", "in": "query", "name": "to", "required": false, "schema": { "format": "date-time", "type": "string" } }, { "in": "query", "name": "sellAsset", "required": false, "schema": { "type": "string" } }, { "in": "query", "name": "buyAsset", "required": false, "schema": { "type": "string" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/OrderListResponse" } } }, "description": "", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "400": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "INVALID_REQUEST: an unknown parameter, or an unknown value of status or kind, with details.field naming the parameter. VALIDATION_ERROR: limit outside 1-20, from after to, or an unregistered Asset. INVALID_CURSOR", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "401": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "", "headers": { "WWW-Authenticate": { "description": "Sent when the request presented a bearer token and it was refused: `Bearer error=\"invalid_token\"` (RFC 6750 section 3). Exchange a new token. A refused API key carries no challenge.", "schema": { "type": "string" } }, "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "403": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "429": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "Too many requests. Wait the number of seconds in `Retry-After` before retrying.", "headers": { "Retry-After": { "description": "Whole seconds to wait before retrying. Always sent on 429; sent on 503 when the wait is known. `details.retryAfter` carries the same wait as an ISO 8601 duration.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "500": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "Something went wrong on our side.", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "503": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "", "headers": { "Retry-After": { "description": "Whole seconds to wait before retrying. Always sent on 429; sent on 503 when the wait is known. `details.retryAfter` carries the same wait as an ISO 8601 duration.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } } }, "security": [ { "api_key": [] }, { "bearer_auth": [] } ], "summary": "List the active workspace's Basic and Advanced orders in newest-first order.", "tags": [ "orders" ] }, "post": { "description": "Place an order by the id of a quote you hold (`{quoteId}` from POST /quotes). A venue (Basic) quote becomes a venue trade (`basicTrade`); a protocol (Advanced) quote becomes a protocol order (`advancedTrade`), after POST /orders/preflight and any wallet signature or source transaction it asks for. Each quote is ordered once: the same quote again answers QUOTE_ALREADY_ORDERED, and a replay with the same Idempotency-Key and body returns the first answer. Read what a quote produced with GET /orders/by-quote/{quoteId}.", "operationId": "post_orders", "parameters": [ { "$ref": "#/components/parameters/WorkspaceId" }, { "description": "Makes a retry safe. Required for API keys (a missing key answers 400 IDEMPOTENCY_KEY_REQUIRED); optional for signed-in members. 1 to 255 bytes, unique per order you mean to place; a UUID is a good choice. A retry with the same key and the same body, from the same credential's owner in the same workspace within 24 hours, returns the first answer and never places a second order. The same key with a different body answers 409 IDEMPOTENCY_CONFLICT; another principal's key answers 403 IDEMPOTENCY_AUTHORITY_REQUIRED. A retry that arrives while the first request is still running waits for it, and answers 409 ORDER_IN_PROGRESS (with Retry-After) if it is still running after 30 seconds. Refusals are not stored: after one, fix the request and send it again with the same key or a new one.", "in": "header", "name": "Idempotency-Key", "required": false, "schema": { "type": [ "string", "null" ] } } ], "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/QuoteOrderRequest" } } }, "required": true }, "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/QuoteOrderResponse" } } }, "description": "Order created: a tagged QuoteOrderResponse (`advancedTrade` or `basicTrade`). A Basic trade on an on-chain venue (for example Uniswap v3, paid from an organisation wallet) answers 200 as soon as the order is durable, with `status: working`, before its wallet signs: signing and broadcast run after the answer. Read the order (GET /orders/{orderId}) or subscribe to `order.updated` for its outcome: `settled`, or `unfilled` (terminal) with `operation.dispatch.outcomeCode: not_sent` and `notSentReason: ON_CHAIN_UNSENT` when no swap was sent (an approval may have been mined first, spending its network fee). A refusal before the order exists (limits, compliance, funds, authority) still answers here with its code. A refusal found after the order is claimed but before its wallet is asked (the LP relationship, the venue registry, the audit record or your authority changed) also answers here with its own code, and that order reads `unfilled` with `outcomeCode: not_sent`.", "headers": { "Idempotent-Replayed": { "description": "`true` when this answer was released from the stored receipt of an earlier request with the same Idempotency-Key and body, rather than produced now. Absent on a first answer.", "schema": { "type": "string" } }, "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "400": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "Invalid request; unknown fields answer INVALID_REQUEST with details.field (send `{quoteId}` from POST /quotes)", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "401": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "Authentication required", "headers": { "WWW-Authenticate": { "description": "Sent when the request presented a bearer token and it was refused: `Bearer error=\"invalid_token\"` (RFC 6750 section 3). Exchange a new token. A refused API key carries no challenge.", "schema": { "type": "string" } }, "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "403": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "Compliance check failed", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "404": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "Quote or authenticated workspace not found. Example: an unknown quote id, refused before any claim or venue call (captured live, rfq e31507829)", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "409": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "Duplicate order, or the CEX route cannot be ordered as signed; LEGACY_CEX_LANE_RETIRED. QUOTE_NOT_EXECUTABLE (`next: requote`), QUOTE_ALREADY_ORDERED, QUOTE_NOT_HELD (`next: requote`), FUNDING_SHORTFALL (`next: fund`), VENUE_QUOTE_OUTSIDE_BOUNDS, VENUE_QUOTE_NOT_PRICED; a bank card: FIAT_CARD_NOT_A_BANK_CARD, FIAT_CARD_ACCOUNT_UNREADABLE, FIAT_BANK_ACCOUNT_UNBOUND (choose the bank account to be paid on the quote card, then requote), FIAT_PAYOUT_FEE_UNVERIFIED, FIAT_FUNDING_MISMATCH, and the hosted Confirm's named conflicts (VENUE_TRADE_RECONFIRMATION_REQUIRED, VENUE_TRADE_PAYOUT_DESTINATION_CHANGED); a Treasury review that can no longer approve the trade, nothing sent: VENUE_TRADE_REVIEW_REJECTED (rejected or cancelled), VENUE_TRADE_REVIEW_EXPIRED (expired, or reapproval required); VENUE_OPERATION_MISMATCH (the named `operationId` does not cover the quote); a protocol quote: PAY_WALLET_UNAVAILABLE (the held binding's pay wallet is no longer available to the caller)", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "410": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "QUOTE_EXPIRED: the held quote lapsed; nothing was sent (`next: requote`). REQUOTE_WINDOW_CLOSED: past its retainUntil; nothing was sent, and a requote no longer refreshes it (`next: search`)", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "413": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "The request body is too large.", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "415": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "The request body must be sent as `application/json`.", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "422": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "Quote, funding, authorization, policy, or venue state rejected the order", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "423": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "TREASURY_FROZEN: the deferred trade's integrator workspace is frozen", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "429": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "Workspace trade rate limit exceeded", "headers": { "Retry-After": { "description": "Whole seconds to wait before retrying. Always sent on 429; sent on 503 when the wait is known. `details.retryAfter` carries the same wait as an ISO 8601 duration.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "500": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "Internal error", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "503": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "Treasury freeze state (TREASURY_FREEZE_UNAVAILABLE) or a chain read the order depends on is temporarily unreadable (for example the source transaction a CEX route signed); retry shortly", "headers": { "Retry-After": { "description": "Whole seconds to wait before retrying. Always sent on 429; sent on 503 when the wait is known. `details.retryAfter` carries the same wait as an ISO 8601 duration.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } } }, "security": [ { "api_key": [] }, { "bearer_auth": [] } ], "summary": "Submit a new order\nPOST /api/v1/orders - Submit an order", "tags": [ "orders" ] } }, "/api/v1/orders/by-quote/{quoteId}": { "get": { "description": "Read-only recovery, independent of quote-stream completion and quote expiry. Requires current view_orders in the selected workspace and orders_read for API keys. ordered names the native advancedTrade or basicTrade address; read that resource for current state. notOrdered is returned only after native order and consumption reads succeed. An unresolved claim returns unknown, never permission to submit again. Foreign and unknown quote ids share 404.", "operationId": "get_quote_order", "parameters": [ { "$ref": "#/components/parameters/WorkspaceId" }, { "in": "path", "name": "quoteId", "required": true, "schema": { "type": "string" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/QuoteOrderRecovery" } } }, "description": "", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "400": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "The request could not be read or failed validation; `error` names the cause.", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "401": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "", "headers": { "WWW-Authenticate": { "description": "Sent when the request presented a bearer token and it was refused: `Bearer error=\"invalid_token\"` (RFC 6750 section 3). Exchange a new token. A refused API key carries no challenge.", "schema": { "type": "string" } }, "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "403": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "404": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "429": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "Too many requests. Wait the number of seconds in `Retry-After` before retrying.", "headers": { "Retry-After": { "description": "Whole seconds to wait before retrying. Always sent on 429; sent on 503 when the wait is known. `details.retryAfter` carries the same wait as an ISO 8601 duration.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "500": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "Something went wrong on our side.", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "503": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "", "headers": { "Retry-After": { "description": "Whole seconds to wait before retrying. Always sent on 429; sent on 503 when the wait is known. `details.retryAfter` carries the same wait as an ISO 8601 duration.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } } }, "security": [ { "api_key": [] }, { "bearer_auth": [] } ], "summary": "Recover the order produced by a held quote", "tags": [ "orders" ] } }, "/api/v1/orders/{orderId}": { "get": { "description": "Returns the latest stored order after a provider refresh. For REST polling, wait 10–15 seconds between reads and honor `Retry-After` on 429; do not poll in a tight loop. API-key clients may instead subscribe to `orders:` on `/api/v1/ws?token=&workspaceId=`, but should perform this GET after an event or reconnect to obtain the complete current projection. Terminality is order-kind dependent: route and atomic venue orders normally complete at `settled`, while claim-based or deferred products may advance to `finalized`.", "operationId": "get_order", "parameters": [ { "$ref": "#/components/parameters/WorkspaceId" }, { "description": "Order ID", "in": "path", "name": "orderId", "required": true, "schema": { "type": "string" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/QuoteOrderResponse" } } }, "description": "Current Basic or Advanced order. States may be skipped; act on terminal, not on a particular sequence.", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "400": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "The request could not be read or failed validation; `error` names the cause.", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "401": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "Missing credentials (MISSING_CREDENTIALS), or an invalid, revoked or expired API key or bearer token. Authentication is required before any order lookup, including legacy orders", "headers": { "WWW-Authenticate": { "description": "Sent when the request presented a bearer token and it was refused: `Bearer error=\"invalid_token\"` (RFC 6750 section 3). Exchange a new token. A refused API key carries no challenge.", "schema": { "type": "string" } }, "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "403": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "API key lacks the orders_read scope in its stored grant or current effective workspace IAM permissions (INSUFFICIENT_SCOPE)", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "404": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "Order not found, not readable by this caller, or the id is not an order id (ORDER_NOT_FOUND). Workspace order-ownership refusals use 404, not 403, so existence is not disclosed. Example: an API key reading an unknown order id (captured live, rfq e31507829)", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "429": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "Read rate limit exceeded", "headers": { "Retry-After": { "description": "Whole seconds to wait before retrying. Always sent on 429; sent on 503 when the wait is known. `details.retryAfter` carries the same wait as an ISO 8601 duration.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "500": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "Internal error", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "503": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "The service is temporarily unavailable. When `Retry-After` is sent, wait that many seconds before retrying.", "headers": { "Retry-After": { "description": "Whole seconds to wait before retrying. Always sent on 429; sent on 503 when the wait is known. `details.retryAfter` carries the same wait as an ISO 8601 duration.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } } }, "security": [ { "api_key": [] }, { "bearer_auth": [] } ], "summary": "Get order status by ID\nGET /api/v1/orders/:id - Get order details by ID", "tags": [ "orders" ] } }, "/api/v1/orders/{orderId}/cancel": { "post": { "description": "Cancels an undispatched Basic order or a pay-in still awaiting funds. Returns the same order envelope as GET, with status cancelled and terminal true. Repeating cancellation leaves the order unchanged. A durable dispatch claim, a progressed funding leg, or a terminal outcome refuses with ORDER_NOT_CANCELLABLE and details.status. Requires current PlaceOrder authority; API keys need orders_write and Idempotency-Key. No venue cancellation is attempted.", "operationId": "cancel_order", "parameters": [ { "$ref": "#/components/parameters/WorkspaceId" }, { "description": "The identifier accepted by GET /orders/{orderId}", "in": "path", "name": "orderId", "required": true, "schema": { "type": "string" } }, { "description": "Required for API keys. Cancellation is naturally idempotent by order id.", "in": "header", "name": "Idempotency-Key", "required": false, "schema": { "type": [ "string", "null" ] } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/QuoteOrderResponse" } } }, "description": "", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "400": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "401": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "", "headers": { "WWW-Authenticate": { "description": "Sent when the request presented a bearer token and it was refused: `Bearer error=\"invalid_token\"` (RFC 6750 section 3). Exchange a new token. A refused API key carries no challenge.", "schema": { "type": "string" } }, "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "403": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "404": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "409": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "ORDER_NOT_CANCELLABLE; details.status is the current public status", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "429": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "Too many requests. Wait the number of seconds in `Retry-After` before retrying.", "headers": { "Retry-After": { "description": "Whole seconds to wait before retrying. Always sent on 429; sent on 503 when the wait is known. `details.retryAfter` carries the same wait as an ISO 8601 duration.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "500": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "Something went wrong on our side.", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "503": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "", "headers": { "Retry-After": { "description": "Whole seconds to wait before retrying. Always sent on 429; sent on 503 when the wait is known. `details.retryAfter` carries the same wait as an ISO 8601 duration.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } } }, "security": [ { "api_key": [] }, { "bearer_auth": [] } ], "summary": "Cancel an order before it is dispatched to a venue.", "tags": [ "orders" ] } }, "/api/v1/orders/{orderId}/funding": { "get": { "description": "Recovery path: the order-create response normally carries the funding action in\nits `nextActions`, but if the create-time presign prefetch failed the client can\nfetch the typed data here on demand (it is re-derived server-side from the order's\n`contractTradeId`). Returns the `signTypedData` action (typed data + where to submit\nthe signature) or 404 when the order has no pending funding step.", "operationId": "get_order_funding", "parameters": [ { "$ref": "#/components/parameters/WorkspaceId" }, { "description": "Order ID", "in": "path", "name": "orderId", "required": true, "schema": { "type": "string" } } ], "responses": { "200": { "description": "Funding typed data to sign", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "400": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "The request could not be read or failed validation; `error` names the cause.", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "401": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "Authentication required or credential invalid", "headers": { "WWW-Authenticate": { "description": "Sent when the request presented a bearer token and it was refused: `Bearer error=\"invalid_token\"` (RFC 6750 section 3). Exchange a new token. A refused API key carries no challenge.", "schema": { "type": "string" } }, "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "403": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "Caller lacks order view permission", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "404": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "No pending funding step for this order", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "429": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "Workspace trade rate limit exceeded", "headers": { "Retry-After": { "description": "Whole seconds to wait before retrying. Always sent on 429; sent on 503 when the wait is known. `details.retryAfter` carries the same wait as an ISO 8601 duration.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "500": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "Internal error", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "503": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "The service is temporarily unavailable. When `Retry-After` is sent, wait that many seconds before retrying.", "headers": { "Retry-After": { "description": "Whole seconds to wait before retrying. Always sent on 429; sent on 503 when the wait is known. `details.retryAfter` carries the same wait as an ISO 8601 duration.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } } }, "security": [ { "api_key": [] }, { "bearer_auth": [] } ], "summary": "`GET /api/v1/orders/{orderId}/funding` — fetch the StableFX funding `typedData` to sign.", "tags": [ "orders" ] } }, "/api/v1/prices": { "get": { "operationId": "get_prices", "parameters": [ { "$ref": "#/components/parameters/WorkspaceId" }, { "description": "Sell Asset id (USDC)", "in": "query", "name": "sell", "required": true, "schema": { "type": "string" } }, { "description": "Buy Asset id (USDT)", "in": "query", "name": "buy", "required": true, "schema": { "type": "string" } }, { "description": "The exact sell amount, a decimal in Asset units; send exactly one of sellAmount, buyAmount or sizes", "in": "query", "name": "sellAmount", "required": false, "schema": { "type": "string" } }, { "description": "The exact buy amount, a decimal in Asset units", "in": "query", "name": "buyAmount", "required": false, "schema": { "type": "string" } }, { "description": "1 to 8 comma-separated positive sell amounts", "in": "query", "name": "sizes", "required": false, "schema": { "type": "string" } }, { "description": "CAIP-2 pin for the sell side", "in": "query", "name": "sell.chain", "required": false, "schema": { "type": "string" } }, { "description": "CAIP-2 pin for the buy side", "in": "query", "name": "buy.chain", "required": false, "schema": { "type": "string" } }, { "description": "Comma-separated venue ids to keep", "in": "query", "name": "venues.include", "required": false, "schema": { "type": "string" } }, { "description": "Comma-separated venue ids to drop", "in": "query", "name": "venues.exclude", "required": false, "schema": { "type": "string" } }, { "description": "any | nativeOnly", "in": "query", "name": "variants.sell", "required": false, "schema": { "type": "string" } }, { "description": "any | nativeOnly", "in": "query", "name": "variants.buy", "required": false, "schema": { "type": "string" } }, { "description": "Comma-separated singleChain, crossChain, offChain", "in": "query", "name": "locations", "required": false, "schema": { "type": "string" } }, { "description": "Comma-separated amm, solver, bridge, rfq, orderBook, fiat", "in": "query", "name": "modalities", "required": false, "schema": { "type": "string" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/PricesResponse" } } }, "description": "Indicative rows, one per venue, location and variant pair; never orderable. A member session, or an API key with prices_read.", "headers": { "cache-control": { "description": "private, no-cache", "schema": { "type": "string" } }, "etag": { "description": "Per principal; send it back in If-None-Match", "schema": { "type": "string" } }, "vary": { "description": "Authorization, X-Workspace-Id", "schema": { "type": "string" } }, "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "304": { "description": "Not modified: If-None-Match matched this principal's current tag", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "400": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "Unknown Asset, chain or venue, or an invalid amount, sizes or filter", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "401": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "Missing or invalid credentials", "headers": { "WWW-Authenticate": { "description": "Sent when the request presented a bearer token and it was refused: `Bearer error=\"invalid_token\"` (RFC 6750 section 3). Exchange a new token. A refused API key carries no challenge.", "schema": { "type": "string" } }, "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "403": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "Not a member, a capability blocker, TAKER_ONBOARDING_INCOMPLETE for an unadmitted LP, or INSUFFICIENT_SCOPE for an API key without prices_read", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "408": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "The request timed out before a response was ready.", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "429": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "PRICES_RATE_LIMIT, with Retry-After in seconds; separate from POST /quotes", "headers": { "Retry-After": { "description": "Whole seconds to wait before retrying. Always sent on 429; sent on 503 when the wait is known. `details.retryAfter` carries the same wait as an ISO 8601 duration.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "500": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "Something went wrong on our side.", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "503": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "PRICES_ELIGIBILITY_WARMING (Retry-After: 1), PRICES_ELIGIBILITY_UNAVAILABLE, PRICES_POLICIES_UNAVAILABLE or TAKER_ADMISSION_UNAVAILABLE", "headers": { "Retry-After": { "description": "Whole seconds to wait before retrying. Always sent on 429; sent on 503 when the wait is known. `details.retryAfter` carries the same wait as an ISO 8601 duration.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } } }, "security": [ { "api_key": [] }, { "bearer_auth": [] } ], "summary": "`GET /api/v1/prices`: indicative per-venue prices for one pair, from memory.", "tags": [ "trading" ] } }, "/api/v1/prices/stream": { "get": { "operationId": "get_prices_stream", "parameters": [ { "$ref": "#/components/parameters/WorkspaceId" }, { "description": "1 to 25 comma-separated SELL:BUY Asset pairs (USDC:USDT,USDC:ZAR)", "in": "query", "name": "pairs", "required": true, "schema": { "type": "string" } }, { "description": "As GET /prices, applied to every pair", "in": "query", "name": "sellAmount", "required": false, "schema": { "type": "string" } }, { "description": "As GET /prices, applied to every pair", "in": "query", "name": "buyAmount", "required": false, "schema": { "type": "string" } }, { "description": "1 to 8 comma-separated positive sell amounts, applied to every pair; pairs × sizes at most 125", "in": "query", "name": "sizes", "required": false, "schema": { "type": "string" } }, { "description": "CAIP-2 pin for the sell side", "in": "query", "name": "sell.chain", "required": false, "schema": { "type": "string" } }, { "description": "CAIP-2 pin for the buy side", "in": "query", "name": "buy.chain", "required": false, "schema": { "type": "string" } }, { "description": "Comma-separated venue ids to keep", "in": "query", "name": "venues.include", "required": false, "schema": { "type": "string" } }, { "description": "Comma-separated venue ids to drop", "in": "query", "name": "venues.exclude", "required": false, "schema": { "type": "string" } }, { "description": "any | nativeOnly", "in": "query", "name": "variants.sell", "required": false, "schema": { "type": "string" } }, { "description": "any | nativeOnly", "in": "query", "name": "variants.buy", "required": false, "schema": { "type": "string" } }, { "description": "Comma-separated singleChain, crossChain, offChain", "in": "query", "name": "locations", "required": false, "schema": { "type": "string" } }, { "description": "Comma-separated amm, solver, bridge, rfq, orderBook, fiat", "in": "query", "name": "modalities", "required": false, "schema": { "type": "string" } } ], "responses": { "200": { "content": { "text/event-stream": { "schema": { "$ref": "#/components/schemas/PricesResponse" } } }, "description": "text/event-stream: a `snapshot` event (a GET /prices body for one pair) when that pair's rows change, a keep-alive comment every 15 s; the stream ends after 10 minutes", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "400": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "More than 25 pairs, or a query GET /prices refuses", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "401": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "Missing or invalid credentials", "headers": { "WWW-Authenticate": { "description": "Sent when the request presented a bearer token and it was refused: `Bearer error=\"invalid_token\"` (RFC 6750 section 3). Exchange a new token. A refused API key carries no challenge.", "schema": { "type": "string" } }, "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "403": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "As GET /prices", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "408": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "The request timed out before a response was ready.", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "429": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "PRICES_RATE_LIMIT, or PRICES_STREAM_LIMIT above 4 subscriptions per principal", "headers": { "Retry-After": { "description": "Whole seconds to wait before retrying. Always sent on 429; sent on 503 when the wait is known. `details.retryAfter` carries the same wait as an ISO 8601 duration.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "500": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "Something went wrong on our side.", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "503": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "As GET /prices", "headers": { "Retry-After": { "description": "Whole seconds to wait before retrying. Always sent on 429; sent on 503 when the wait is known. `details.retryAfter` carries the same wait as an ISO 8601 duration.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } } }, "security": [ { "api_key": [] }, { "bearer_auth": [] } ], "summary": "`GET /api/v1/prices/stream`: `snapshot` events per pair on change.", "tags": [ "trading" ] } }, "/api/v1/quotes": { "post": { "description": "The asset-pair contract (PairQuoteRequest or RequoteRequest); the legacy intent body is retired, so an object without `sell` or `requote` is 400 INVALID_REQUEST naming `sell`. Validated in order (INVALID_REQUEST naming the field, REQUOTE_FIELDS_CONFLICT, UNKNOWN_ASSET / UNKNOWN_CHAIN / UNKNOWN_VENUE naming the value, ASSET_NOT_ON_CHAIN (a side's Asset has no deployment on the chain pinned for it), INVALID_AMOUNT, SAME_ASSET_NEEDS_CHAIN, CHAIN_PIN_NEEDS_ON_CHAIN, out-of-range INVALID_REQUEST, ROUTING_OPTIONS_FORBIDDEN), then the request_quotes capability, and answered with a PairQuoteSet: every venue planned, venue-hitting plans limited to one every 3 s per principal (429 QUOTE_RATE_LIMITED with Retry-After; cache-only plans are not limited), quotes held for their owner and the set recorded for GET /quotes/requests/{quoteRequestId}. A requote body asks only the earlier quote's venue again (every venue of a multi-leg route, which answers that same route), as JSON (never a stream), and answers a PairQuoteSet whose one quote names it in requoteOf; the earlier quote stays held until its own expiry. Requote refusals: 400 CORRIDOR_NOT_OFFERED / WALLET_NOT_ON_CHAIN (a custody vault or registered workspace address bound to a chain it is not an account of; also on a fresh request), 403 SOURCE_NOT_OWNED / ACCOUNT_NOT_AVAILABLE / VENUE_NOT_AVAILABLE_TO_CREDENTIAL, 404 QUOTE_NOT_FOUND (unknown and another principal's quote alike), 409 REQUOTE_REFUSED (details.reason) / REQUOTE_NEEDS_WALLET / PERSONAL_TARGET_NOT_ALLOWED / QUOTE_CANNOT_BE_REFRESHED (a quote recorded before it could be refreshed for a broker's client), 410 REQUOTE_WINDOW_CLOSED (10 minutes after its expiry, past retainUntil; next search: request quotes again), 429 QUOTE_RATE_LIMITED / VENUE_FIRM_QUOTE_LIMITED /BUDGET_EXHAUSTED with Retry-After, 503 QUOTE_STORE_UNAVAILABLE / QUOTE_NOT_READY, 504 REQUOTE_TIMED_OUT. Every refusal, at every status, is the one error body ApiError {error, message, requestId, timestamp, next?, details?}. Optional filters narrow the auction. Orderable venue-account cards require a current MFA human Company/Broker session, or an API key holding workspace_venue_trade with its venue switch enabled and HMAC request signing. A member key with quotes_request but no venue-trading authority receives native indicative cards (firm false, expiresAt null) with sourceRefusal venueTradeScopeRequired and a re-issuance remedy, without any firm ask. On-chain sources without an organisation wallet grant are indicative with sourceRefusal onchainWalletNotUsable and a wallet-grant remedy; no signer is resolved. Quote-only observations never spend firm-quote budget, and their held refusal is returned if ordered. An API key quotes with quotes_request (which needs orders_write on the same key); it has no Default wallet of a member, so it binds a workspace wallet in bind.wallets: a workspace custody wallet, or an organisation wallet the key was granted (without that grant the source reads API_KEY_ORGANISATION_WALLET_SCOPE_REQUIRED), never a personal one (409 PERSONAL_TARGET_NOT_ALLOWED); its protocol venues remain non-orderable until it binds one; quote-only observations may show a native indicative price without borrowing a wallet. A desk on a production site is firm-asked only on request, the same for sessions and API keys, each one call: name it in filters.venues.include and its firm quote returns in that response, or requote its indicative card ({requote: quoteId}). A broad request never asks it: its card stays indicative and reads unavailable priceOnRequest when it publishes no price. Its next is requote, except where its firm quote lives 5 s or less: then it is order (execute within my limit), and that order makes the one ask, trading only at or above the person's minReceive; a requote of that card (Get firm quote) also asks it once under the same desk limits and returns a firm, executable card with its expiresAt. A sandbox or testnet desk that publishes nothing is firm-asked on a person's or API caller's request within the desk limits (firmQuoteLimited with retryAfter when they are reached); automation principals get it on requote only. On a venue-account card, bind.deliverTo {kind: address, chain, address, destinationTag?} names where the trade's output is withdrawn when the order for it fills: one of the workspace's own wallets that is an approved withdrawal destination of that venue account, for the receipt asset, with exactly that destination tag or memo. The card then carries that deliverTo, a network fee line for the venue's withdrawal fee (the most the order will pay; a higher fee at send refuses) and a receive net of it (netReceived unavailable withdrawalFeeUnread when the fee could not be read), and a requote keeps it. A venue that cannot deliver there answers its source unavailable with DESTINATION_NOT_APPROVED, DELIVER_TO_NOT_A_WORKSPACE_WALLET, WITHDRAWAL_CHAIN_UNSUPPORTED (no withdrawal network for that chain on the site; test sites have none), DELIVER_TO_AMBIGUOUS, WITHDRAWAL_FEE_EXCEEDS_AMOUNT, deliverToCalldataUnsupported or deliverToNotPermitted (deliverTo needs a member session with ViewWallets; an API key lists no deliverTo candidates, and a requote naming one answers 409 REQUOTE_REFUSED with details.reason deliverToNotPermitted). The request spends one Quote token; connection indicative pacing is reported on cards.", "operationId": "post_quotes", "parameters": [ { "$ref": "#/components/parameters/WorkspaceId" } ], "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/QuotesRequestBody" } } }, "required": true }, "responses": { "200": { "content": { "application/json": { "example": { "quoteRequestId": "rq_01M5Z6TX3X834KT79RBP6X6FQB", "quotes": [], "sources": [ { "asked": false, "detail": "This account is still being set up. Complete its required activation steps in Treasury before requesting prices.", "reason": "accountSetupIncomplete", "status": "unavailable", "venue": { "id": "selini-rfq", "integrationMode": "basic", "logoUrl": null, "modality": "rfq", "name": "Selini Capital", "protocolVersion": null, "venueId": "selini", "venueName": "Selini" } } ], "venueAsked": false }, "schema": { "$ref": "#/components/schemas/QuotesResponseBody" } }, "text/event-stream": { "schema": { "type": "string" } } }, "description": "Quotes aggregated successfully: a PairQuoteSet. Accept: text/event-stream selects JSON-data SSE events: quote (PairQuote), source (QuoteSourceEntry), complete (PairQuoteSet), error. A venue the workspace's LP relationship does not allow reads restricted venueRelationship with neutral words in detail and is never asked. Event IDs increase monotonically; the stream includes keepalive comments. Example: broad USD 25000 to USDC, Selini source unavailable accountSetupIncomplete and asked=false; captured live (rfq 2ef31a1ea), one of twelve sources retained and referenceMid omitted. No Selini price or firm ask is implied; Selini USD settlement precision is six decimal places.", "headers": { "x-accel-buffering": { "description": "no for the SSE response", "schema": { "type": "string" } }, "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "400": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "Malformed JSON request body, or an asset-pair body refused by a validation row (its code names the row). Example: a broad USD to USDC request with amount zero, refused before any venue plan or provider I/O; captured live (rfq 2ef31a1ea)", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "401": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "Authentication required", "headers": { "WWW-Authenticate": { "description": "Sent when the request presented a bearer token and it was refused: `Bearer error=\"invalid_token\"` (RFC 6750 section 3). Exchange a new token. A refused API key carries no challenge.", "schema": { "type": "string" } }, "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "403": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "Workspace or capability access denied, or the named integrationAppId does not belong to the caller (INTEGRATION_APP_MISMATCH, INTEGRATION_APP_FORBIDDEN)", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "404": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "Authenticated workspace not found, or a requoted quote id that is unknown or another principal's (QUOTE_NOT_FOUND). Example: a requote of an unknown quote id (captured live, rfq e31507829)", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "409": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "Wallet identity conflicts with the requested ACE owner; LEGACY_CEX_LANE_RETIRED", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "410": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "A requote of a quote more than 10 minutes past its expiry (QUOTE_EXPIRED)", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "413": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "Quote request body exceeds the configured limit", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "415": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "Content-Type must be application/json", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "422": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "Request body could not be read or the quote intent is not executable for the selected router or venue state", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "429": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "Workspace or per-key trade rate limit exceeded (RATE_LIMITED), or a second venue-hitting asset-pair request inside 3 s (QUOTE_RATE_LIMITED, with Retry-After)", "headers": { "Retry-After": { "description": "Whole seconds to wait before retrying. Always sent on 429; sent on 503 when the wait is known. `details.retryAfter` carries the same wait as an ISO 8601 duration.", "schema": { "minimum": 0, "type": "integer" } }, "retry-after": { "description": "Seconds until the request may be retried", "schema": { "format": "int64", "minimum": 0, "type": "integer" } }, "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "500": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "Internal error", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "503": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "The integration app binding could not be read (INTEGRATION_APP_UNAVAILABLE), or the registry catalogue cannot answer an asset-pair body (QUOTE_CATALOGUE_UNAVAILABLE)", "headers": { "Retry-After": { "description": "Whole seconds to wait before retrying. Always sent on 429; sent on 503 when the wait is known. `details.retryAfter` carries the same wait as an ISO 8601 duration.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "504": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "The requoted venue did not answer in time (REQUOTE_TIMED_OUT)", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } } }, "security": [ { "api_key": [] }, { "bearer_auth": [] } ], "summary": "Unified protocol and venue-account quote auction", "tags": [ "quotes" ] } }, "/api/v1/quotes/requests/{quoteRequestId}": { "get": { "description": "The quotes, sources and orders of one asset-pair POST /quotes answer, as recorded off the hot path. Readable by the principal that asked, by a member session with view_orders in its workspace, and by an orders_read API key when an order was placed on one of its quotes in that workspace. Unknown and foreign ids are the same 404. requestedByYou says whether the caller asked; only then can it order these quotes.", "operationId": "get_quote_request", "parameters": [ { "$ref": "#/components/parameters/WorkspaceId" }, { "description": "The set's quoteRequestId (rq_…)", "in": "path", "name": "quoteRequestId", "required": true, "schema": { "type": "string" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/QuoteRequestRecord" } } }, "description": "The recorded quote request", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "400": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "The request could not be read or failed validation; `error` names the cause.", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "401": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "Authentication required", "headers": { "WWW-Authenticate": { "description": "Sent when the request presented a bearer token and it was refused: `Bearer error=\"invalid_token\"` (RFC 6750 section 3). Exchange a new token. A refused API key carries no challenge.", "schema": { "type": "string" } }, "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "403": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "Workspace context or membership is invalid", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "404": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "QUOTE_REQUEST_NOT_FOUND: unknown, or not readable by this caller (captured live, rfq e31507829)", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "408": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "The request timed out before a response was ready.", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "429": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "Too many requests. Wait the number of seconds in `Retry-After` before retrying.", "headers": { "Retry-After": { "description": "Whole seconds to wait before retrying. Always sent on 429; sent on 503 when the wait is known. `details.retryAfter` carries the same wait as an ISO 8601 duration.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "500": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "Something went wrong on our side.", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "503": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "QUOTE_REQUEST_NOT_READY: issued moments ago and still being recorded (retry after about one second); QUOTE_REQUEST_UNAVAILABLE: the record could not be read", "headers": { "Retry-After": { "description": "Whole seconds to wait before retrying. Always sent on 429; sent on 503 when the wait is known. `details.retryAfter` carries the same wait as an ISO 8601 duration.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } } }, "security": [ { "api_key": [] }, { "bearer_auth": [] } ], "summary": "Read a quote request's recorded answer", "tags": [ "quotes" ] } }, "/api/v1/workspaces/{workspaceId}/capabilities": { "get": { "description": "The workspace's KYB state (`workspace.kybStatus`) and, for each capability, whether it is\nallowed now or blocked, with each blocker's code and the step that clears it. The quote and\norder routes enforce the same decision. An API key needs the `dashboard_read` scope and reads\nonly the workspace it is bound to.", "operationId": "get_workspace_capabilities", "parameters": [ { "$ref": "#/components/parameters/WorkspaceId" }, { "description": "Workspace ID", "in": "path", "name": "workspaceId", "required": true, "schema": { "type": "string" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/WorkspaceCapabilitiesResponse" } } }, "description": "Capability snapshot with blockers per capability and permission-filtered KYB record facts; failed review reads report unavailable while preserving HTTP 200", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "400": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "The request could not be read or failed validation; `error` names the cause.", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "401": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "Authentication required", "headers": { "WWW-Authenticate": { "description": "Sent when the request presented a bearer token and it was refused: `Bearer error=\"invalid_token\"` (RFC 6750 section 3). Exchange a new token. A refused API key carries no challenge.", "schema": { "type": "string" } }, "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "403": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "An API key without `dashboard_read` (`INSUFFICIENT_SCOPE`), or an inaccessible header workspace (`WORKSPACE_SCOPE_MISMATCH`)", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "404": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "`WORKSPACE_NOT_FOUND` - the path workspace is unknown or differs from the authenticated workspace; the response is identical", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "408": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "The request timed out before a response was ready.", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "429": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "Too many requests. Wait the number of seconds in `Retry-After` before retrying.", "headers": { "Retry-After": { "description": "Whole seconds to wait before retrying. Always sent on 429; sent on 503 when the wait is known. `details.retryAfter` carries the same wait as an ISO 8601 duration.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "500": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "Something went wrong on our side.", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "503": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "Current business profile or observation authority is unavailable; no capability snapshot is released. A profile that was never readable is not this case: its snapshot is released and names `KYB_UNAVAILABLE`", "headers": { "Retry-After": { "description": "Whole seconds to wait before retrying. Always sent on 429; sent on 503 when the wait is known. `details.retryAfter` carries the same wait as an ISO 8601 duration.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } } }, "security": [ { "bearer_auth": [] } ], "summary": "Read the workspace's verification state and the capabilities it allows", "tags": [ "workspaces" ] } }, "/api/v1/workspaces/{workspaceId}/trades": { "get": { "description": "The one trade history. Projections: scope=workspace (default) reads the workspace's taker orders and venue trades; a member without view_compliance reads only their own, whatever the scope. scope=mine reads the caller's own (a member session only). scope=umbrella reads a broker's clients' orders with each client category's field visibility (view_umbrella_compliance). perspective=maker reads an LP workspace's fills with pseudonymised counterparties (view_settlements); with settlementStage or minAgeSeconds, its unsettled orders by stage (view_bilateral_documents). The default perspective is taker in every workspace. Every row carries tradeId, kind (order or venueTrade) and projection. Page with limit and cursor; format=csv returns the same filtered rows. Accepts a member session or an API key with trades_read; CSV is a member session only.", "operationId": "list_workspace_trades", "parameters": [ { "$ref": "#/components/parameters/WorkspaceId" }, { "description": "Workspace ID", "in": "path", "name": "workspaceId", "required": true, "schema": { "type": "string" } }, { "description": "mine, workspace or umbrella. Default: workspace. umbrella needs a broker\nworkspace and view_umbrella_compliance; mine needs a member session.", "in": "query", "name": "scope", "required": false, "schema": { "$ref": "#/components/schemas/TradeScope" } }, { "description": "taker (default, in every workspace) or maker. maker needs an LP workspace and\nview_settlements.", "in": "query", "name": "perspective", "required": false, "schema": { "$ref": "#/components/schemas/TradePerspective" } }, { "description": "all, order or venueTrade. Default: all for taker and umbrella; for maker the\nfills default (on-chain orders); umbrella has orders only.", "in": "query", "name": "kind", "required": false, "schema": { "$ref": "#/components/schemas/TradeKindFilter" } }, { "description": "Settlement status filter, as the projection names it.", "in": "query", "name": "status", "required": false, "schema": { "type": "string" } }, { "description": "Counterparty: the LP's catalogue venue id, the row's `lpVenueId` (taker; a venue\ntrade matches its execution type's venue), the client workspace (umbrella) or the\ntaker (maker).", "in": "query", "name": "counterpartyId", "required": false, "schema": { "type": "string" } }, { "description": "One of the LP's own venues, by its id (maker only).", "in": "query", "name": "venueId", "required": false, "schema": { "type": "string" } }, { "description": "The member or client who placed the order: member (taker), user id (umbrella),\nentity (maker).", "in": "query", "name": "client", "required": false, "schema": { "type": "string" } }, { "description": "Settlement stage of an unsettled order (maker only).", "in": "query", "name": "settlementStage", "required": false, "schema": { "type": "string" } }, { "description": "Only orders at least this many seconds old (maker only, with settlementStage).", "in": "query", "name": "minAgeSeconds", "required": false, "schema": { "format": "int64", "type": "integer" } }, { "description": "Placed at or after this RFC 3339 instant (umbrella: a UTC midnight).", "in": "query", "name": "from", "required": false, "schema": { "format": "date-time", "type": "string" } }, { "description": "Placed at or before this RFC 3339 instant (umbrella: a UTC midnight).", "in": "query", "name": "to", "required": false, "schema": { "format": "date-time", "type": "string" } }, { "description": "Page size; the projection's own bounds apply (default 25).", "in": "query", "name": "limit", "required": false, "schema": { "format": "int32", "minimum": 0, "type": "integer" } }, { "description": "The nextCursor of the previous page.", "in": "query", "name": "cursor", "required": false, "schema": { "type": "string" } }, { "description": "json (default) or csv. csv returns the projection's export of the same filters.", "in": "query", "name": "format", "required": false, "schema": { "$ref": "#/components/schemas/TradesFormat" } }, { "description": "Taker: comma-separated lifecycle buckets (inProgress, completed, failed, refunded, unknown). Maker: the fills lifecycle filter", "in": "query", "name": "lifecycle", "required": false, "schema": { "type": "string" } }, { "description": "Taker: taker, support, counterparty or none", "in": "query", "name": "nextActor", "required": false, "schema": { "type": "string" } }, { "description": "Taker: either side's display asset symbol (case-insensitive)", "in": "query", "name": "asset", "required": false, "schema": { "type": "string" } }, { "description": "Corridor (source-dest)", "in": "query", "name": "corridor", "required": false, "schema": { "type": "string" } }, { "description": "Taker: linked wallet id", "in": "query", "name": "walletId", "required": false, "schema": { "type": "string" } }, { "description": "Taker: wallet address (custody vault or linked wallet)", "in": "query", "name": "address", "required": false, "schema": { "type": "string" } }, { "description": "The row's routingPath type: direct or via_broker", "in": "query", "name": "routingPath", "required": false, "schema": { "type": "string" } }, { "description": "Minimum USD notional", "in": "query", "name": "amountMin", "required": false, "schema": { "format": "double", "type": "number" } }, { "description": "Maximum USD notional", "in": "query", "name": "amountMax", "required": false, "schema": { "format": "double", "type": "number" } }, { "description": "Field to sort by, as the projection names it", "in": "query", "name": "sortBy", "required": false, "schema": { "type": "string" } }, { "description": "Taker: asc or desc", "in": "query", "name": "sortDir", "required": false, "schema": { "type": "string" } }, { "description": "Taker: only orders whose nextAction is present", "in": "query", "name": "actionRequired", "required": false, "schema": { "type": "boolean" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/TradeList" } }, "text/csv": { "schema": { "type": "string" } } }, "description": "One page of trades; with format=csv, the projection's CSV of the same filters", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "400": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "INVALID_REQUEST naming the parameter in field: an unknown parameter or value, a filter the projection cannot apply, a cursor from another list, or two names for one filter. VALIDATION_ERROR: a malformed filter", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "401": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "Authentication is missing or invalid.", "headers": { "WWW-Authenticate": { "description": "Sent when the request presented a bearer token and it was refused: `Bearer error=\"invalid_token\"` (RFC 6750 section 3). Exchange a new token. A refused API key carries no challenge.", "schema": { "type": "string" } }, "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "403": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "scope=mine with an API key; umbrella without view_umbrella_compliance; maker without an LP workspace and view_settlements; the umbrella or maker projection with an API key (JWT_REQUIRED); an API key without trades_read", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "404": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "WORKSPACE_NOT_FOUND: the path names a workspace other than the caller's", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "408": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "The request timed out before a response was ready.", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "429": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "Too many requests. Wait the number of seconds in `Retry-After` before retrying.", "headers": { "Retry-After": { "description": "Whole seconds to wait before retrying. Always sent on 429; sent on 503 when the wait is known. `details.retryAfter` carries the same wait as an ISO 8601 duration.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "500": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "Something went wrong on our side.", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "503": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "TRADE_PROJECTION_UNAVAILABLE: the projection's owner is not installed on this stack", "headers": { "Retry-After": { "description": "Whole seconds to wait before retrying. Always sent on 429; sent on 503 when the wait is known. `details.retryAfter` carries the same wait as an ISO 8601 duration.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } } }, "security": [ { "bearer_auth": [] }, { "api_key": [] } ], "summary": "GET /api/v1/workspaces/{workspaceId}/trades", "tags": [ "trades" ] } }, "/api/v1/workspaces/{workspaceId}/trades/{tradeId}": { "get": { "description": "One trade through the same projection as the list: the workspace's or the caller's own taker order or venue trade, a broker umbrella record with the client category's field visibility, or an LP's fill with pseudonymised counterparties. Taker orders keep their detail fields at the top level. Accepts a member session or an API key with trades_read.", "operationId": "get_workspace_trade", "parameters": [ { "$ref": "#/components/parameters/WorkspaceId" }, { "description": "Workspace ID", "in": "path", "name": "workspaceId", "required": true, "schema": { "type": "string" } }, { "description": "The trade's tradeId: an order id, or a venue trade's operation id", "in": "path", "name": "tradeId", "required": true, "schema": { "type": "string" } }, { "description": "mine, workspace (default) or umbrella, as on the list", "in": "query", "name": "scope", "required": false, "schema": { "$ref": "#/components/schemas/TradeScope" } }, { "description": "taker (default) or maker, as on the list", "in": "query", "name": "perspective", "required": false, "schema": { "$ref": "#/components/schemas/TradePerspective" } }, { "description": "Maker: the LP's own venue that filled it", "in": "query", "name": "venueId", "required": false, "schema": { "type": "string" } }, { "description": "Maker: protocol, venueAccount or all", "in": "query", "name": "flow", "required": false, "schema": { "type": "string" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/TradeDetail" } } }, "description": "The trade, with tradeId, kind and projection", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "400": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "INVALID_REQUEST naming the parameter in field: a list filter or a parameter the projection cannot apply", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "401": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "Authentication is missing or invalid.", "headers": { "WWW-Authenticate": { "description": "Sent when the request presented a bearer token and it was refused: `Bearer error=\"invalid_token\"` (RFC 6750 section 3). Exchange a new token. A refused API key carries no challenge.", "schema": { "type": "string" } }, "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "403": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "Another member's order without view_compliance (RECORDS_OUT_OF_SCOPE); scope=mine with an API key; umbrella without view_umbrella_compliance; maker without an LP workspace and view_settlements; the umbrella or maker projection with an API key (JWT_REQUIRED); an API key without trades_read", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "404": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "Trade not found in this projection, or WORKSPACE_NOT_FOUND", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "408": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "The request timed out before a response was ready.", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "429": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "Too many requests. Wait the number of seconds in `Retry-After` before retrying.", "headers": { "Retry-After": { "description": "Whole seconds to wait before retrying. Always sent on 429; sent on 503 when the wait is known. `details.retryAfter` carries the same wait as an ISO 8601 duration.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "500": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "Something went wrong on our side.", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "503": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "TRADE_PROJECTION_UNAVAILABLE: the projection's owner is not installed on this stack", "headers": { "Retry-After": { "description": "Whole seconds to wait before retrying. Always sent on 429; sent on 503 when the wait is known. `details.retryAfter` carries the same wait as an ISO 8601 duration.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } } }, "security": [ { "bearer_auth": [] }, { "api_key": [] } ], "summary": "GET /api/v1/workspaces/{workspaceId}/trades/{tradeId}", "tags": [ "trades" ] } }, "/api/v1/workspaces/{workspaceId}/venue-accounts/{venueAccountId}/balances": { "get": { "description": "Requires current ViewWallets authority in a Company/Broker workspace (or an admitted LP taker). API keys and OAuth clients additionally require treasury_read; this read never authorizes a payment. Read through the connection holding the account's balance credential, a configured one first (its `connectionId` and execution type are in the body); the observation, staleness and display-value rules are those of the venue-connection balance read, so a balance key held only by a disabled venue returns its last-known balance. 409 VENUE_ACCOUNT_FUNDS_IN_WALLETS for an account whose money is in the company's own wallets, VENUE_ACCOUNT_REVERIFY_REQUIRED when no current key holds its balance, VENUE_ACCOUNT_REVOKED for a disconnected account, VENUE_ACCOUNT_VENUE_UNKNOWN when its venue is not recognised; 404 VENUE_ACCOUNT_NOT_FOUND. 403 VENUE_READ_AUTHORITY_REFUSED whenever the caller's read authority has ended, whether the check before the read or a recheck during it sees it (reason `authority_ended`: the credential is revoked or expired, or no longer carries treasury_read; reason `permission_withdrawn`: its principal lost ViewWallets, its membership or taker admission); a session that has itself ended answers 401.", "operationId": "get_venue_account_balances", "parameters": [ { "$ref": "#/components/parameters/WorkspaceId" }, { "description": "Current company or broker workspace", "in": "path", "name": "workspaceId", "required": true, "schema": { "type": "string" } }, { "in": "path", "name": "venueAccountId", "required": true, "schema": { "type": "string" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/VenueConnectionBalances" } } }, "description": "", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "400": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "The request could not be read or failed validation; `error` names the cause.", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "401": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "", "headers": { "WWW-Authenticate": { "description": "Sent when the request presented a bearer token and it was refused: `Bearer error=\"invalid_token\"` (RFC 6750 section 3). Exchange a new token. A refused API key carries no challenge.", "schema": { "type": "string" } }, "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "403": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "404": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "408": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "The request timed out before a response was ready.", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "409": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "429": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "Too many requests. Wait the number of seconds in `Retry-After` before retrying.", "headers": { "Retry-After": { "description": "Whole seconds to wait before retrying. Always sent on 429; sent on 503 when the wait is known. `details.retryAfter` carries the same wait as an ISO 8601 duration.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "500": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "Something went wrong on our side.", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "503": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "", "headers": { "Retry-After": { "description": "Whole seconds to wait before retrying. Always sent on 429; sent on 503 when the wait is known. `details.retryAfter` carries the same wait as an ISO 8601 duration.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } } }, "security": [ { "bearer_auth": [] }, { "api_key": [] } ], "summary": "Read the venue account's balances at its venue", "tags": [ "venue-accounts" ] } }, "/api/v1/workspaces/{workspaceId}/venue-accounts/{venueAccountId}/deposit-history": { "get": { "description": "Requires current ViewWallets authority in a Company/Broker workspace (or an admitted LP taker). API keys and OAuth clients additionally require treasury_read. Read through the configured connection holding the account's balance credential, with the venue-connection deposit-history rules. A bounded window, not a paged list: each answer is one live read of the venue's own credit history for `lookbackDays` (1 to 30, default 7) ending now, returned whole with its `since`, `until`, `observedAt` and `expiresAt`. A window holding more than 1,000 venue records answers no credits, with reasonCode DEPOSIT_HISTORY_WINDOW_TOO_LARGE; read a shorter window. No cursor is offered because the venues' histories have no position that stays stable from one live read to the next, so a cursor could skip or repeat a credit. The 409 refusals of the account balance read, plus VENUE_ACCOUNT_FUNDING_VENUE_DISABLED when only a disabled venue holds the balance key. 403 VENUE_READ_AUTHORITY_REFUSED whenever the caller's read authority has ended, whether the check before the read or a recheck during it sees it (reason `authority_ended`: the credential is revoked or expired, or no longer carries treasury_read; reason `permission_withdrawn`: its principal lost ViewWallets, its membership or taker admission); a session that has itself ended answers 401.", "operationId": "get_venue_account_deposit_history", "parameters": [ { "$ref": "#/components/parameters/WorkspaceId" }, { "description": "Current company or broker workspace", "in": "path", "name": "workspaceId", "required": true, "schema": { "type": "string" } }, { "in": "path", "name": "venueAccountId", "required": true, "schema": { "type": "string" } }, { "in": "query", "name": "asset", "required": true, "schema": { "type": "string" } }, { "in": "query", "name": "chainRef", "required": true, "schema": { "type": "string" } }, { "in": "query", "name": "lookbackDays", "required": false, "schema": { "format": "int32", "minimum": 0, "type": "integer" } } ], "responses": { "200": { "content": { "application/json": { "example": { "asset": "USDT", "chainRef": "eip155:1", "connection": { "accountBindingStatus": "unverified", "accountId": "fb181171-3a8d-48ed-b2a6-240989108c3f", "capabilities": [ { "capability": "account_identity", "controlRevision": 3, "credentialRevision": 1, "expiresAt": "2026-10-28T12:14:12.452753Z", "freshness": "expired", "observedAt": "2026-10-28T12:09:12.452753Z", "reason": "Independent account evidence is not implemented for this provider.", "reasonCode": "INDEPENDENT_OBSERVATIONS_UNSUPPORTED", "source": "provider_api", "state": "unsupported" } ], "connectionId": "381d08ba-aef7-4c69-9542-4617d700f621", "controlRevision": 3, "createdAt": "2026-10-21T11:36:33.609968Z", "credentialRevision": 1, "executionOffering": "basic", "executionTypeId": "valr-rfq", "keyFingerprint": "64bb…e1c4", "label": "VALR account", "lifecycle": "configured", "providerSite": "global", "tradePaused": false, "updatedAt": "2026-10-28T19:37:49.206816Z", "venueEnablementId": "54f228e9-254d-44b3-8f39-0d0aa0463ffc", "withdrawalPaused": false, "workspaceId": "5f56c3dd-cc2d-4ea0-8772-fa254a012e91" }, "credits": null, "expiresAt": null, "networkCode": "", "networkConfirmed": false, "observedAt": null, "reason": "This provider/site does not expose qualified account deposit history.", "reasonCode": "ACCOUNT_DEPOSIT_HISTORY_UNSUPPORTED", "since": "2026-09-29T07:59:17.652259Z", "state": "unsupported", "until": "2026-10-29T07:59:17.652259Z" }, "schema": { "$ref": "#/components/schemas/VenueConnectionDepositHistory" } } }, "description": "A provider without qualified deposit history: unsupported, with no credited values; account capabilities trimmed to one entry (captured live, rfq be48e0453)", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "400": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "401": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "", "headers": { "WWW-Authenticate": { "description": "Sent when the request presented a bearer token and it was refused: `Bearer error=\"invalid_token\"` (RFC 6750 section 3). Exchange a new token. A refused API key carries no challenge.", "schema": { "type": "string" } }, "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "403": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "404": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "408": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "The request timed out before a response was ready.", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "409": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "429": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "Too many requests. Wait the number of seconds in `Retry-After` before retrying.", "headers": { "Retry-After": { "description": "Whole seconds to wait before retrying. Always sent on 429; sent on 503 when the wait is known. `details.retryAfter` carries the same wait as an ISO 8601 duration.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "500": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "Something went wrong on our side.", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "503": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "", "headers": { "Retry-After": { "description": "Whole seconds to wait before retrying. Always sent on 429; sent on 503 when the wait is known. `details.retryAfter` carries the same wait as an ISO 8601 duration.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } } }, "security": [ { "bearer_auth": [] }, { "api_key": [] } ], "summary": "Read the venue account's deposit history", "tags": [ "venue-accounts" ] } }, "/api/v1/workspaces/{workspaceId}/venue-accounts/{venueAccountId}/deposit-instructions": { "get": { "description": "Requires current ViewWallets authority in a Company/Broker workspace (or an admitted LP taker). API keys additionally require treasury_read; this read never authorizes a payment. Read through the configured connection holding the account's balance credential. Select currency for bank instructions: bankDeposit states available, referenceOnly, notOffered or unread, with a reason and reasonCode. Available receiving coordinates or a reference-only result are in bankInstructions. notOffered comes only from the venue's declared bank offering; failed source reads are unread, never notOffered. The answer is Cache-Control no-store and every receiving-account or full-reference disclosure is audited. The connection read's selection and fee rules apply. The account balance read's 409 refusals also apply, plus VENUE_ACCOUNT_FUNDING_VENUE_DISABLED when only a disabled venue holds the balance key. 403 VENUE_READ_AUTHORITY_REFUSED whenever the caller's read authority has ended, whether the check before the read or a recheck during it sees it (reason `authority_ended`: the credential is revoked or expired, or no longer carries treasury_read; reason `permission_withdrawn`: its principal lost ViewWallets, its membership or taker admission); a session that has itself ended answers 401.", "operationId": "get_venue_account_deposit_instructions", "parameters": [ { "$ref": "#/components/parameters/WorkspaceId" }, { "description": "Current company or broker workspace", "in": "path", "name": "workspaceId", "required": true, "schema": { "type": "string" } }, { "in": "path", "name": "venueAccountId", "required": true, "schema": { "type": "string" } }, { "in": "query", "name": "asset", "required": false, "schema": { "type": "string" } }, { "in": "query", "name": "chainRef", "required": false, "schema": { "type": "string" } }, { "description": "ISO fiat currency for the bank-deposit read; never with `asset` or `chainRef`.", "in": "query", "name": "currency", "required": false, "schema": { "type": "string" } }, { "description": "The dedicated fiat venue's linked bank id for the sending bank. Required with currency for a dedicated fiat venue and refused for other venues.", "in": "query", "name": "providerBankId", "required": false, "schema": { "type": "string" } } ], "responses": { "200": { "content": { "application/json": { "example": { "bankDeposit": { "currency": "ZAR", "reason": "The deposit reference was read from the bound venue account. The venue does not publish its receiving bank details over its API: its own app shows them next to this reference. No deposit has been confirmed.", "reasonCode": "BANK_RECEIVING_DETAILS_NOT_EXPOSED", "state": "referenceOnly" }, "bankInstructions": { "currency": "ZAR", "depositFee": { "amount": "0", "charging": "unverified", "currency": "ZAR", "source": "VALR S5 support.valr.com/hc/en-us/articles/360015777451: EFT deposits free (research/08 §5)", "status": "declared" }, "depositReference": "VR••••87", "expectedArrival": { "basis": "default", "expectedArrivalAt": "2026-11-02T21:59:59Z", "manualReviewAt": "2026-11-06T21:59:59Z", "overdueAt": "2026-11-03T09:59:59Z", "publicHolidaysApplied": true, "source": "VALR S20 https://support.valr.com/hc/en-us/articles/360028737292 \"How long does it take for my Rand (ZAR) deposit to reflect in my VALR account?\" (updated 2026-10-12T13:34:54Z, retrieved 2026-10-15)", "status": "expected" }, "observedAt": "2026-10-29T07:59:16.425271Z", "ownNameRequired": true, "rails": [ "eft" ], "receivingDetails": { "reason": "venue_api_does_not_expose", "status": "unavailable" }, "testAccount": false }, "connection": { "accountBindingStatus": "unverified", "accountId": "fb181171-3a8d-48ed-b2a6-240989108c3f", "capabilities": [ { "capability": "account_identity", "controlRevision": 3, "credentialRevision": 1, "expiresAt": "2026-10-28T12:14:12.452753Z", "freshness": "expired", "observedAt": "2026-10-28T12:09:12.452753Z", "reason": "Independent account evidence is not implemented for this provider.", "reasonCode": "INDEPENDENT_OBSERVATIONS_UNSUPPORTED", "source": "provider_api", "state": "unsupported" } ], "connectionId": "381d08ba-aef7-4c69-9542-4617d700f621", "controlRevision": 3, "createdAt": "2026-10-21T11:36:33.609968Z", "credentialRevision": 1, "executionOffering": "basic", "executionTypeId": "valr-rfq", "keyFingerprint": "64bb…e1c4", "label": "VALR account", "lifecycle": "configured", "providerSite": "global", "tradePaused": false, "updatedAt": "2026-10-28T19:37:49.206816Z", "venueEnablementId": "54f228e9-254d-44b3-8f39-0d0aa0463ffc", "withdrawalPaused": false, "workspaceId": "5f56c3dd-cc2d-4ea0-8772-fa254a012e91" }, "instructions": null, "options": [ { "asset": "USDC", "chainRef": "eip155:8453", "networkCode": "Base" } ], "reason": "The deposit reference was read from the bound venue account. The venue does not publish its receiving bank details over its API: its own app shows them next to this reference. No deposit has been confirmed.", "reasonCode": "BANK_RECEIVING_DETAILS_NOT_EXPOSED", "state": "supported", "unconfirmedNetworkAssets": [ "USDT" ] }, "schema": { "$ref": "#/components/schemas/VenueConnectionDeposits" } } }, "description": "Bank-rail instructions for ZAR on a VALR venue account; account capabilities trimmed to one entry and the deposit reference masked here (the API returns it in full to the member) (captured live, rfq be48e0453)", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "400": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "401": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "", "headers": { "WWW-Authenticate": { "description": "Sent when the request presented a bearer token and it was refused: `Bearer error=\"invalid_token\"` (RFC 6750 section 3). Exchange a new token. A refused API key carries no challenge.", "schema": { "type": "string" } }, "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "403": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "404": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "408": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "The request timed out before a response was ready.", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "409": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "429": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "Too many requests. Wait the number of seconds in `Retry-After` before retrying.", "headers": { "Retry-After": { "description": "Whole seconds to wait before retrying. Always sent on 429; sent on 503 when the wait is known. `details.retryAfter` carries the same wait as an ISO 8601 duration.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "500": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "Something went wrong on our side.", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "503": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "", "headers": { "Retry-After": { "description": "Whole seconds to wait before retrying. Always sent on 429; sent on 503 when the wait is known. `details.retryAfter` carries the same wait as an ISO 8601 duration.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } } }, "security": [ { "bearer_auth": [] }, { "api_key": [] } ], "summary": "Read how to deposit into the venue account", "tags": [ "venue-accounts" ] } }, "/api/v1/workspaces/{workspaceId}/venue-enablements": { "get": { "description": "A Company/Broker current human session, or an API key or service account with treasury_read whose principal holds ViewWallets. Each venue account with its venue, where its funds are held, its wallets, linked accounts and execution types, each venue's key state, and whether disabling that venue would retire its key. Each item's `accountId` is the `{venueAccountId}` of `GET …/venue-accounts/{venueAccountId}/balances`, `/deposit-history` and `/deposit-instructions`. Oldest first, paged by `limit` (default 20, at most 100) and the opaque `cursor` from the previous page's `nextCursor`; `nextCursor` is null on the last page. 400 INVALID_CURSOR for a cursor this list did not issue. 403 VENUE_READ_AUTHORITY_REFUSED when the caller's authority to read venue accounts has ended (reason `authority_ended`: the credential is revoked or expired, or no longer carries treasury_read; reason `permission_withdrawn`: its principal lost ViewWallets, its membership or taker admission). A session that has itself ended answers 401.", "operationId": "list_venue_enablements", "parameters": [ { "$ref": "#/components/parameters/WorkspaceId" }, { "description": "Current company or broker workspace", "in": "path", "name": "workspaceId", "required": true, "schema": { "type": "string" } }, { "description": "Opaque `nextCursor` from the previous page of the same list and filters.", "in": "query", "name": "cursor", "required": false, "schema": { "type": "string" } }, { "description": "Page size, default 20, clamped to 1..=100.", "in": "query", "name": "limit", "required": false, "schema": { "format": "int32", "minimum": 0, "type": "integer" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/VenueEnablementsPage" } } }, "description": "", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "400": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "401": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "", "headers": { "WWW-Authenticate": { "description": "Sent when the request presented a bearer token and it was refused: `Bearer error=\"invalid_token\"` (RFC 6750 section 3). Exchange a new token. A refused API key carries no challenge.", "schema": { "type": "string" } }, "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "403": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "408": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "The request timed out before a response was ready.", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "429": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "Too many requests. Wait the number of seconds in `Retry-After` before retrying.", "headers": { "Retry-After": { "description": "Whole seconds to wait before retrying. Always sent on 429; sent on 503 when the wait is known. `details.retryAfter` carries the same wait as an ISO 8601 duration.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "500": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "Something went wrong on our side.", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "503": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "", "headers": { "Retry-After": { "description": "Whole seconds to wait before retrying. Always sent on 429; sent on 503 when the wait is known. `details.retryAfter` carries the same wait as an ISO 8601 duration.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } } }, "security": [ { "bearer_auth": [] }, { "api_key": [] } ], "summary": "List the workspace's venue accounts", "tags": [ "venue-enablements" ] } }, "/api/v1/workspaces/{workspaceId}/webhooks": { "get": { "operationId": "list_webhooks", "parameters": [ { "$ref": "#/components/parameters/WorkspaceId" }, { "description": "Workspace ID", "in": "path", "name": "workspaceId", "required": true, "schema": { "type": "string" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "items": { "$ref": "#/components/schemas/WebhookConfigView" }, "type": "array" } } }, "description": "List of webhooks", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "400": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "The request could not be read or failed validation; `error` names the cause.", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "401": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "Authentication is missing or invalid.", "headers": { "WWW-Authenticate": { "description": "Sent when the request presented a bearer token and it was refused: `Bearer error=\"invalid_token\"` (RFC 6750 section 3). Exchange a new token. A refused API key carries no challenge.", "schema": { "type": "string" } }, "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "403": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "Forbidden: webhook management permission required", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "408": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "The request timed out before a response was ready.", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "429": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "Too many requests. Wait the number of seconds in `Retry-After` before retrying.", "headers": { "Retry-After": { "description": "Whole seconds to wait before retrying. Always sent on 429; sent on 503 when the wait is known. `details.retryAfter` carries the same wait as an ISO 8601 duration.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "500": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "Something went wrong on our side.", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "503": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "The service is temporarily unavailable. When `Retry-After` is sent, wait that many seconds before retrying.", "headers": { "Retry-After": { "description": "Whole seconds to wait before retrying. Always sent on 429; sent on 503 when the wait is known. `details.retryAfter` carries the same wait as an ISO 8601 duration.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } } }, "security": [ { "bearer_auth": [] }, { "api_key": [] } ], "summary": "`GET /api/v1/workspaces/{workspaceId}/webhooks`", "tags": [ "webhooks" ] }, "post": { "description": "Create a webhook with a shown-once whsec_ secret. Standard Webhooks sends webhook-id, webhook-timestamp (Unix seconds), and webhook-signature: v1,, signing id.timestamp.rawBody with the base64-decoded key. Verify the exact raw body and enforce five-minute timestamp tolerance. API keys require webhooks_manage and current manage_webhooks permission. Human sessions require manage_webhooks or manage_credentials.", "operationId": "create_webhook", "parameters": [ { "$ref": "#/components/parameters/WorkspaceId" }, { "description": "Workspace ID", "in": "path", "name": "workspaceId", "required": true, "schema": { "type": "string" } }, { "description": "Required for every caller (1 to 255 bytes; missing or empty is 400 IDEMPOTENCY_KEY_REQUIRED). The same key and body within 24 hours answers the stored 201 again: the same webhook, with secret null and secretShownOnce true, and no second webhook is created. The same key with a different body is 409 IDEMPOTENCY_CONFLICT.", "in": "header", "name": "Idempotency-Key", "required": true, "schema": { "type": "string" } } ], "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CreateWebhookRequest" } } }, "required": true }, "responses": { "201": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CreateWebhookResponse" } } }, "description": "Webhook created, or the stored creation replayed for the same Idempotency-Key and body (secret null on a replay)", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "400": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "Validation error, or IDEMPOTENCY_KEY_REQUIRED / IDEMPOTENCY_KEY_INVALID", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "401": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "Authentication is missing or invalid.", "headers": { "WWW-Authenticate": { "description": "Sent when the request presented a bearer token and it was refused: `Bearer error=\"invalid_token\"` (RFC 6750 section 3). Exchange a new token. A refused API key carries no challenge.", "schema": { "type": "string" } }, "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "403": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "Insufficient role", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "408": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "The request timed out before a response was ready.", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "409": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "Webhook already exists, or IDEMPOTENCY_CONFLICT: the key was used with a different body", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "413": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "The request body is too large.", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "415": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "The request body must be sent as `application/json`.", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "429": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "Too many requests. Wait the number of seconds in `Retry-After` before retrying.", "headers": { "Retry-After": { "description": "Whole seconds to wait before retrying. Always sent on 429; sent on 503 when the wait is known. `details.retryAfter` carries the same wait as an ISO 8601 duration.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "500": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "Something went wrong on our side.", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "503": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "IDEMPOTENCY_UNAVAILABLE: the key could not be checked; nothing was created", "headers": { "Retry-After": { "description": "Whole seconds to wait before retrying. Always sent on 429; sent on 503 when the wait is known. `details.retryAfter` carries the same wait as an ISO 8601 duration.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } } }, "security": [ { "bearer_auth": [] }, { "api_key": [] } ], "summary": "`POST /api/v1/workspaces/{workspaceId}/webhooks`", "tags": [ "webhooks" ] } }, "/api/v1/workspaces/{workspaceId}/webhooks/{webhookId}": { "delete": { "description": "Delete a webhook. API keys require webhooks_manage and current manage_webhooks permission. Human sessions require manage_webhooks or manage_credentials.", "operationId": "delete_webhook", "parameters": [ { "$ref": "#/components/parameters/WorkspaceId" }, { "description": "Workspace ID", "in": "path", "name": "workspaceId", "required": true, "schema": { "type": "string" } }, { "description": "Webhook ID", "in": "path", "name": "webhookId", "required": true, "schema": { "type": "string" } } ], "responses": { "204": { "description": "Webhook deleted", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "400": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "The request could not be read or failed validation; `error` names the cause.", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "401": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "Authentication is missing or invalid.", "headers": { "WWW-Authenticate": { "description": "Sent when the request presented a bearer token and it was refused: `Bearer error=\"invalid_token\"` (RFC 6750 section 3). Exchange a new token. A refused API key carries no challenge.", "schema": { "type": "string" } }, "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "403": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "Forbidden", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "404": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "Webhook not found", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "408": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "The request timed out before a response was ready.", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "429": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "Too many requests. Wait the number of seconds in `Retry-After` before retrying.", "headers": { "Retry-After": { "description": "Whole seconds to wait before retrying. Always sent on 429; sent on 503 when the wait is known. `details.retryAfter` carries the same wait as an ISO 8601 duration.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "500": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "Something went wrong on our side.", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "503": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "The service is temporarily unavailable. When `Retry-After` is sent, wait that many seconds before retrying.", "headers": { "Retry-After": { "description": "Whole seconds to wait before retrying. Always sent on 429; sent on 503 when the wait is known. `details.retryAfter` carries the same wait as an ISO 8601 duration.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } } }, "security": [ { "bearer_auth": [] }, { "api_key": [] } ], "summary": "`DELETE /api/v1/workspaces/{workspaceId}/webhooks/{webhookId}`", "tags": [ "webhooks" ] }, "get": { "operationId": "get_webhook", "parameters": [ { "$ref": "#/components/parameters/WorkspaceId" }, { "description": "Workspace ID", "in": "path", "name": "workspaceId", "required": true, "schema": { "type": "string" } }, { "description": "Webhook ID", "in": "path", "name": "webhookId", "required": true, "schema": { "type": "string" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/WebhookConfigView" } } }, "description": "Webhook configuration", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "400": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "The request could not be read or failed validation; `error` names the cause.", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "401": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "Authentication is missing or invalid.", "headers": { "WWW-Authenticate": { "description": "Sent when the request presented a bearer token and it was refused: `Bearer error=\"invalid_token\"` (RFC 6750 section 3). Exchange a new token. A refused API key carries no challenge.", "schema": { "type": "string" } }, "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "403": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "Forbidden", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "404": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "Webhook not found", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "408": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "The request timed out before a response was ready.", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "429": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "Too many requests. Wait the number of seconds in `Retry-After` before retrying.", "headers": { "Retry-After": { "description": "Whole seconds to wait before retrying. Always sent on 429; sent on 503 when the wait is known. `details.retryAfter` carries the same wait as an ISO 8601 duration.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "500": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "Something went wrong on our side.", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "503": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "The service is temporarily unavailable. When `Retry-After` is sent, wait that many seconds before retrying.", "headers": { "Retry-After": { "description": "Whole seconds to wait before retrying. Always sent on 429; sent on 503 when the wait is known. `details.retryAfter` carries the same wait as an ISO 8601 duration.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } } }, "security": [ { "bearer_auth": [] }, { "api_key": [] } ], "summary": "`GET /api/v1/workspaces/{workspaceId}/webhooks/{webhookId}`", "tags": [ "webhooks" ] }, "patch": { "description": "Update any of url, events or active without recreating the endpoint. URLs use the same HTTPS and SSRF validation as creation; events must be current subscription names. Changing url or events makes the caller the endpoint's accountable principal, whose read rights then govern protected event delivery; changing only active keeps the existing principal. API keys require webhooks_manage and current manage_webhooks permission. Human sessions require manage_webhooks or manage_credentials.", "operationId": "update_webhook", "parameters": [ { "$ref": "#/components/parameters/WorkspaceId" }, { "description": "Workspace ID", "in": "path", "name": "workspaceId", "required": true, "schema": { "type": "string" } }, { "description": "Webhook ID", "in": "path", "name": "webhookId", "required": true, "schema": { "type": "string" } } ], "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/UpdateWebhookRequest" } } }, "required": true }, "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/WebhookConfig" } } }, "description": "Webhook updated", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "400": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "Invalid URL, empty update or unknown event", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "401": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "Authentication is missing or invalid.", "headers": { "WWW-Authenticate": { "description": "Sent when the request presented a bearer token and it was refused: `Bearer error=\"invalid_token\"` (RFC 6750 section 3). Exchange a new token. A refused API key carries no challenge.", "schema": { "type": "string" } }, "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "403": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "Forbidden", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "404": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "Not found", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "408": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "The request timed out before a response was ready.", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "409": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "URL already registered", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "413": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "The request body is too large.", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "415": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "The request body must be sent as `application/json`.", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "429": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "Too many requests. Wait the number of seconds in `Retry-After` before retrying.", "headers": { "Retry-After": { "description": "Whole seconds to wait before retrying. Always sent on 429; sent on 503 when the wait is known. `details.retryAfter` carries the same wait as an ISO 8601 duration.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "500": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "Something went wrong on our side.", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "503": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "The service is temporarily unavailable. When `Retry-After` is sent, wait that many seconds before retrying.", "headers": { "Retry-After": { "description": "Whole seconds to wait before retrying. Always sent on 429; sent on 503 when the wait is known. `details.retryAfter` carries the same wait as an ISO 8601 duration.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } } }, "security": [ { "bearer_auth": [] }, { "api_key": [] } ], "tags": [ "webhooks" ] } }, "/api/v1/workspaces/{workspaceId}/webhooks/{webhookId}/deliveries": { "get": { "operationId": "list_webhook_deliveries", "parameters": [ { "$ref": "#/components/parameters/WorkspaceId" }, { "description": "Workspace ID", "in": "path", "name": "workspaceId", "required": true, "schema": { "type": "string" } }, { "description": "Webhook ID", "in": "path", "name": "webhookId", "required": true, "schema": { "type": "string" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/PaginatedWebhookDeliveries" } } }, "description": "Paginated webhook deliveries", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "400": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "The request could not be read or failed validation; `error` names the cause.", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "401": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "Authentication is missing or invalid.", "headers": { "WWW-Authenticate": { "description": "Sent when the request presented a bearer token and it was refused: `Bearer error=\"invalid_token\"` (RFC 6750 section 3). Exchange a new token. A refused API key carries no challenge.", "schema": { "type": "string" } }, "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "403": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "Forbidden", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "404": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "Webhook not found", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "408": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "The request timed out before a response was ready.", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "429": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "Too many requests. Wait the number of seconds in `Retry-After` before retrying.", "headers": { "Retry-After": { "description": "Whole seconds to wait before retrying. Always sent on 429; sent on 503 when the wait is known. `details.retryAfter` carries the same wait as an ISO 8601 duration.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "500": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "Something went wrong on our side.", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "503": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "The service is temporarily unavailable. When `Retry-After` is sent, wait that many seconds before retrying.", "headers": { "Retry-After": { "description": "Whole seconds to wait before retrying. Always sent on 429; sent on 503 when the wait is known. `details.retryAfter` carries the same wait as an ISO 8601 duration.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } } }, "security": [ { "bearer_auth": [] }, { "api_key": [] } ], "summary": "`GET /api/v1/workspaces/{workspaceId}/webhooks/{webhookId}/deliveries`", "tags": [ "webhooks" ] } }, "/api/v1/workspaces/{workspaceId}/webhooks/{webhookId}/deliveries/{deliveryId}/redeliver": { "post": { "operationId": "redeliver_webhook_delivery", "parameters": [ { "$ref": "#/components/parameters/WorkspaceId" }, { "description": "Workspace ID", "in": "path", "name": "workspaceId", "required": true, "schema": { "type": "string" } }, { "description": "Webhook ID", "in": "path", "name": "webhookId", "required": true, "schema": { "type": "string" } }, { "description": "Original delivery ID", "in": "path", "name": "deliveryId", "required": true, "schema": { "format": "uuid", "type": "string" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/WebhookDelivery" } } }, "description": "Redelivery result", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "400": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "The request could not be read or failed validation; `error` names the cause.", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "401": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "Authentication is missing or invalid.", "headers": { "WWW-Authenticate": { "description": "Sent when the request presented a bearer token and it was refused: `Bearer error=\"invalid_token\"` (RFC 6750 section 3). Exchange a new token. A refused API key carries no challenge.", "schema": { "type": "string" } }, "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "403": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "Forbidden", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "404": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "Webhook or delivery not found", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "408": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "The request timed out before a response was ready.", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "409": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "Delivery cannot be redelivered", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "429": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "Too many requests. Wait the number of seconds in `Retry-After` before retrying.", "headers": { "Retry-After": { "description": "Whole seconds to wait before retrying. Always sent on 429; sent on 503 when the wait is known. `details.retryAfter` carries the same wait as an ISO 8601 duration.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "500": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "Delivery unavailable", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "503": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "The service is temporarily unavailable. When `Retry-After` is sent, wait that many seconds before retrying.", "headers": { "Retry-After": { "description": "Whole seconds to wait before retrying. Always sent on 429; sent on 503 when the wait is known. `details.retryAfter` carries the same wait as an ISO 8601 duration.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } } }, "security": [ { "bearer_auth": [] }, { "api_key": [] } ], "summary": "Send one retained payload again with current URL and signing secret.", "tags": [ "webhooks" ] } }, "/api/v1/workspaces/{workspaceId}/webhooks/{webhookId}/reactivate": { "post": { "description": "Reactivate an auto-paused webhook. Resets consecutive_failures + paused_at. API keys require webhooks_manage and current manage_webhooks permission. Human sessions require manage_webhooks or manage_credentials.", "operationId": "reactivate_webhook", "parameters": [ { "$ref": "#/components/parameters/WorkspaceId" }, { "description": "Workspace ID", "in": "path", "name": "workspaceId", "required": true, "schema": { "type": "string" } }, { "description": "Webhook ID", "in": "path", "name": "webhookId", "required": true, "schema": { "type": "string" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/WebhookConfig" } } }, "description": "Webhook reactivated", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "400": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "The request could not be read or failed validation; `error` names the cause.", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "401": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "Authentication is missing or invalid.", "headers": { "WWW-Authenticate": { "description": "Sent when the request presented a bearer token and it was refused: `Bearer error=\"invalid_token\"` (RFC 6750 section 3). Exchange a new token. A refused API key carries no challenge.", "schema": { "type": "string" } }, "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "403": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "Forbidden", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "404": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "Webhook not found", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "408": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "The request timed out before a response was ready.", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "429": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "Too many requests. Wait the number of seconds in `Retry-After` before retrying.", "headers": { "Retry-After": { "description": "Whole seconds to wait before retrying. Always sent on 429; sent on 503 when the wait is known. `details.retryAfter` carries the same wait as an ISO 8601 duration.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "500": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "Something went wrong on our side.", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "503": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "The service is temporarily unavailable. When `Retry-After` is sent, wait that many seconds before retrying.", "headers": { "Retry-After": { "description": "Whole seconds to wait before retrying. Always sent on 429; sent on 503 when the wait is known. `details.retryAfter` carries the same wait as an ISO 8601 duration.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } } }, "security": [ { "bearer_auth": [] }, { "api_key": [] } ], "summary": "`POST /api/v1/workspaces/{workspaceId}/webhooks/{webhookId}/reactivate`", "tags": [ "webhooks" ] } }, "/api/v1/workspaces/{workspaceId}/webhooks/{webhookId}/rotate-secret": { "post": { "description": "Rotate a webhook's Standard Webhooks secret. Returns a shown-once whsec_ secret. For 24 hours, webhook-signature carries space-separated v1, signatures from current and previous decoded keys; either verifies id.timestamp.rawBody. API keys require webhooks_manage and current manage_webhooks permission. Human sessions require manage_webhooks or manage_credentials.", "operationId": "rotate_webhook_secret", "parameters": [ { "$ref": "#/components/parameters/WorkspaceId" }, { "description": "Workspace ID", "in": "path", "name": "workspaceId", "required": true, "schema": { "type": "string" } }, { "description": "Webhook ID", "in": "path", "name": "webhookId", "required": true, "schema": { "type": "string" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/RotateSecretResponse" } } }, "description": "Secret rotated", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "400": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "The request could not be read or failed validation; `error` names the cause.", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "401": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "Authentication is missing or invalid.", "headers": { "WWW-Authenticate": { "description": "Sent when the request presented a bearer token and it was refused: `Bearer error=\"invalid_token\"` (RFC 6750 section 3). Exchange a new token. A refused API key carries no challenge.", "schema": { "type": "string" } }, "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "403": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "Forbidden", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "404": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "Webhook not found", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "408": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "The request timed out before a response was ready.", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "429": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "Too many requests. Wait the number of seconds in `Retry-After` before retrying.", "headers": { "Retry-After": { "description": "Whole seconds to wait before retrying. Always sent on 429; sent on 503 when the wait is known. `details.retryAfter` carries the same wait as an ISO 8601 duration.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "500": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "Something went wrong on our side.", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "503": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "The service is temporarily unavailable. When `Retry-After` is sent, wait that many seconds before retrying.", "headers": { "Retry-After": { "description": "Whole seconds to wait before retrying. Always sent on 429; sent on 503 when the wait is known. `details.retryAfter` carries the same wait as an ISO 8601 duration.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } } }, "security": [ { "bearer_auth": [] }, { "api_key": [] } ], "summary": "`POST /api/v1/workspaces/{workspaceId}/webhooks/{webhookId}/rotate-secret`", "tags": [ "webhooks" ] } }, "/api/v1/workspaces/{workspaceId}/webhooks/{webhookId}/test": { "post": { "description": "Trigger a webhook.test delivery signed with the same Standard Webhooks headers (webhook-id, webhook-timestamp, webhook-signature) as live events. API keys require webhooks_manage and current manage_webhooks permission. Human sessions require manage_webhooks or manage_credentials.", "operationId": "test_webhook", "parameters": [ { "$ref": "#/components/parameters/WorkspaceId" }, { "description": "Workspace ID", "in": "path", "name": "workspaceId", "required": true, "schema": { "type": "string" } }, { "description": "Webhook ID", "in": "path", "name": "webhookId", "required": true, "schema": { "type": "string" } } ], "responses": { "200": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/WebhookDelivery" } } }, "description": "Test delivery result", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "400": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "The request could not be read or failed validation; `error` names the cause.", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "401": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "Authentication is missing or invalid.", "headers": { "WWW-Authenticate": { "description": "Sent when the request presented a bearer token and it was refused: `Bearer error=\"invalid_token\"` (RFC 6750 section 3). Exchange a new token. A refused API key carries no challenge.", "schema": { "type": "string" } }, "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "403": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "Forbidden", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "404": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "Webhook not found", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "408": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "The request timed out before a response was ready.", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "429": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "Too many requests. Wait the number of seconds in `Retry-After` before retrying.", "headers": { "Retry-After": { "description": "Whole seconds to wait before retrying. Always sent on 429; sent on 503 when the wait is known. `details.retryAfter` carries the same wait as an ISO 8601 duration.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "500": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "Delivery failed", "headers": { "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } }, "503": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiError" } } }, "description": "The service is temporarily unavailable. When `Retry-After` is sent, wait that many seconds before retrying.", "headers": { "Retry-After": { "description": "Whole seconds to wait before retrying. Always sent on 429; sent on 503 when the wait is known. `details.retryAfter` carries the same wait as an ISO 8601 duration.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-limit": { "description": "Sent only when the request's API key has its own requests-per-minute limit: that limit. Sessions, and keys without their own limit, never receive it.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-remaining": { "description": "Requests left before this caller is limited: the per-address limit's when that limit counted the request, otherwise the API key's own remaining allowance. Absent when no finite limit counted the request.", "schema": { "minimum": 0, "type": "integer" } }, "x-ratelimit-reset": { "description": "Sent with x-ratelimit-limit, only when the request's API key has its own limit: whole seconds until that allowance is full again.", "schema": { "minimum": 0, "type": "integer" } }, "x-request-id": { "description": "The request's id: the caller's valid `X-Request-Id`, or a generated UUID v4. Quote it when asking for support.", "schema": { "type": "string" } } } } }, "security": [ { "bearer_auth": [] }, { "api_key": [] } ], "summary": "`POST /api/v1/workspaces/{workspaceId}/webhooks/{webhookId}/test`", "tags": [ "webhooks" ] } } }, "security": [ { "api_key": [] } ], "servers": [ { "url": "https://api.tetrafi.io" } ], "tags": [ { "description": "Request price quotes from multiple solvers for cross-chain transactions", "name": "quotes" }, { "description": "Submit, track, and manage cross-chain orders", "name": "orders" }, { "description": "Canonical trading pairs and aggregator metadata", "name": "trading" }, { "description": "Authentication — registration, login, SIWE, OAuth, sessions, login activity", "name": "auth" }, { "description": "Workspace CRUD, settings, members, and team management", "name": "workspaces" }, { "description": "Webhook management — CRUD, secret rotation, test delivery, delivery history", "name": "webhooks" } ] }