{"components":{"schemas":{"APIKeyInfoResponse":{"properties":{"api_version":{"description":"API version the key is pinned to.","example":"v1","type":"string"},"created_at":{"description":"ISO-8601 time when the key was created.","example":"2026-05-16T10:30:00Z","format":"date-time","type":"string"},"id":{"description":"Unique identifier of the API key.","example":"7c9e6679-7425-40de-944b-e07fc1f90ae7","type":"string"},"last_used_at":{"description":"ISO-8601 time the key was last used; absent if never used.","format":"date-time","type":"string"},"name":{"description":"Human-readable name of the API key.","example":"Production server key","type":"string"},"object":{"description":"Object type discriminator; always \"api_key\".","example":"api_key","type":"string"},"organization_id":{"description":"Identifier of the organization the key belongs to.","example":"a1b2c3d4-5e6f-7a8b-9c0d-1e2f3a4b5c6d","type":"string"},"scopes":{"description":"Permission scopes granted to the key.","items":{"type":"string"},"type":"array"}},"type":"object"},"ActionTypeMeta":{"properties":{"config_schema":{"additionalProperties":true,"type":"object"},"description":{"type":"string"},"value":{"type":"string"}},"type":"object"},"AddressResponse":{"properties":{"address":{"description":"On-chain address string","example":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e","type":"string"},"chain":{"description":"Blockchain the address belongs to","example":"ethereum","type":"string"},"created_at":{"description":"ISO-8601 timestamp when the address was created","example":"2026-05-16T10:30:00Z","format":"date-time","type":"string"},"format":{"description":"Address format (e.g. p2wpkh, p2tr, p2pkh for Bitcoin)","type":"string"},"id":{"description":"Unique identifier of the address record","example":"3f1a2b3c-4d5e-6f7a-8b9c-0d1e2f3a4b5c","type":"string"},"is_primary":{"description":"Whether this is the wallet's primary receive address","example":true,"type":"boolean"},"label":{"description":"Optional partner-facing label for the address","example":"Customer deposits","type":"string"},"network":{"description":"Network the address is on (e.g. mainnet)","example":"mainnet","type":"string"},"object":{"description":"Object type, always \"address\"","example":"address","type":"string"},"wallet_id":{"description":"Identifier of the wallet this address belongs to","example":"a1b2c3d4-5e6f-7a8b-9c0d-1e2f3a4b5c6d","type":"string"}},"type":"object"},"ApproverCandidateResponse":{"properties":{"id":{"description":"Identifier to pass as approvers[].id in a require_approval action config.","example":"3f1a2b3c-4d5e-6f7a-8b9c-0d1e2f3a4b5c","type":"string"},"member_count":{"description":"Number of members assigned the role; present only for type=role.","type":"integer"},"name":{"description":"Display name of the user or role.","example":"Ebot Ndip","type":"string"},"object":{"description":"Object type discriminator; always \"approver_candidate\".","example":"approver_candidate","type":"string"},"org_role":{"description":"Organization role of the user; present only for type=user.","type":"string"},"type":{"description":"Candidate kind: user or role.","example":"user","type":"string"}},"type":"object"},"AssetResponse":{"properties":{"chain":{"description":"Blockchain the asset lives on.","example":"ethereum","type":"string"},"decimals":{"description":"Number of decimals used to convert the asset's base units to its display unit.","example":6,"type":"integer"},"id":{"description":"Unique identifier of the asset.","example":"usdc-ethereum","type":"string"},"name":{"description":"Human-readable name of the asset.","example":"USD Coin","type":"string"},"object":{"description":"Object type discriminator; always \"asset\".","example":"asset","type":"string"},"symbol":{"description":"Ticker symbol of the asset.","example":"USDC","type":"string"},"type":{"description":"Asset type (e.g. native, erc20, spl, trc20).","example":"erc20","type":"string"}},"type":"object"},"BalanceResponse":{"properties":{"asset":{"description":"Symbol of the asset (e.g. USDC, ETH)","type":"string"},"asset_decimals":{"description":"Number of decimals used to convert base units to the display unit","type":"integer"},"asset_id":{"description":"Identifier of the asset this balance is denominated in","type":"string"},"available":{"description":"Spendable balance as an integer in the asset's smallest base unit","type":"string"},"balance":{"description":"Total balance as an integer in the asset's smallest base unit","type":"string"},"chain":{"description":"Blockchain the balance is held on","type":"string"},"locked":{"description":"Reserved/locked balance as an integer in the asset's smallest base unit","type":"string"},"network":{"description":"Network the balance is held on (e.g. mainnet)","type":"string"},"object":{"description":"Object type, always \"balance\"","type":"string"}},"type":"object"},"CategoryMeta":{"properties":{"description":{"type":"string"},"value":{"type":"string"}},"type":"object"},"ChainResponse":{"properties":{"id":{"description":"Chain identifier.","example":"ethereum","type":"string"},"name":{"description":"Chain name (currently the same value as id).","example":"ethereum","type":"string"},"networks":{"description":"Networks supported on the chain.","example":"[\"mainnet\"]","items":{"type":"string"},"type":"array"},"object":{"description":"Object type discriminator; always \"chain\".","example":"chain","type":"string"}},"type":"object"},"ConditionFieldMeta":{"properties":{"description":{"type":"string"},"name":{"type":"string"},"valid_operators":{"items":{"type":"string"},"type":"array"},"value_type":{"type":"string"}},"type":"object"},"CreateAddressRequest":{"properties":{"address_format":{"description":"Bitcoin address format: p2wpkh (default), p2tr, or p2pkh; ignored on account-based chains","enum":["p2wpkh","p2tr","p2pkh"],"example":"p2wpkh","type":"string"},"label":{"description":"Optional partner-facing label stored on the address record","example":"Customer deposits","type":"string"},"network":{"deprecated":true,"description":"Deprecated. The environment determines the network (live→mainnet, sandbox→testnet); an omitted value defaults to the wallet's network. Ignored when it contradicts the environment.","example":"mainnet","type":"string"}},"type":"object"},"CreateGasStationRequest":{"properties":{"auto_refill_enabled":{"description":"Whether to automatically refill the gas station when it drops below the threshold.","type":"boolean"},"chain":{"description":"Blockchain the gas station funds fees on.","example":"ethereum","type":"string"},"gas_strategy":{"description":"Gas pricing strategy to apply when sponsoring fees.","example":"standard","type":"string"},"name":{"description":"Human-readable name for the gas station.","example":"Ethereum gas station","type":"string"},"network":{"deprecated":true,"description":"Deprecated. The environment determines the network (live→mainnet, sandbox→testnet); an omitted value defaults to the chain's network for this environment. Ignored when it contradicts the environment.","example":"mainnet","type":"string"},"refill_amount":{"description":"Amount (display unit) to transfer on each auto-refill.","example":"0.25","type":"string"},"refill_from_wallet_id":{"description":"Identifier of the wallet auto-refills are funded from.","example":"f47ac10b-58cc-4372-a567-0e02b2c3d479","type":"string"},"threshold":{"description":"Balance (display unit) below which auto-refill triggers.","example":"0.05","type":"string"}},"required":["name","chain","threshold"],"type":"object"},"CreateSubscriptionRequest":{"properties":{"address":{"description":"On-chain address to monitor.","example":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e","type":"string"},"chain":{"description":"Blockchain the address is on.","example":"ethereum","type":"string"},"event_type":{"description":"Optional event-type filter; when empty, all on-chain event types are delivered.","example":"incoming_token_tx","type":"string"},"label":{"description":"Optional partner-facing label for the subscription.","example":"Customer deposit monitor","type":"string"},"metadata":{"additionalProperties":true,"description":"Arbitrary partner-supplied key/value metadata.","type":"object"},"network":{"description":"Network the address is on (e.g. mainnet).","example":"mainnet","type":"string"},"webhook_url":{"description":"URL that on-chain events for this address are POSTed to.","example":"https://example.com/webhooks/bitnob","format":"uri","type":"string"}},"required":["address","chain","webhook_url"],"type":"object"},"CreateTransactionRequest":{"properties":{"amount":{"description":"Amount to send as a human-readable decimal in the asset's display unit","example":"25.5","type":"string"},"asset":{"description":"Asset to send — the asset ID (e.g. USDT_TRX, USDC_ETH, TRX) or, for a single-chain wallet, the bare symbol (e.g. USDT) which resolves to the wallet's chain. See GET /assets for the full list.","example":"USDT_TRX","type":"string"},"fee_level":{"description":"Fee priority level: low, medium, or high","enum":["low","medium","high"],"example":"medium","type":"string"},"fee_rate":{"description":"Explicit Bitcoin fee rate in sat/vB; overrides fee_level. Bitcoin only","example":"15","type":"string"},"fill_fee_from_unselected":{"description":"Top up from the rest of the wallet if pinned inputs don't cover amount+fee. Bitcoin only.","type":"boolean"},"inputs":{"description":"Bitcoin UTXOs to spend ({txid, vout}). Coin control — Bitcoin only. Not supported with treat_as_gross_amount, or when the transaction would require approval or a policy time-delay (returns 400).","items":{"$ref":"#/components/schemas/TransactionInput"},"maxItems":250,"type":"array"},"max_fee_rate":{"description":"Bitcoin fee-rate ceiling in sat/vB; caps the effective rate. Bitcoin only","example":"50","type":"string"},"network":{"deprecated":true,"description":"Deprecated. The environment determines the network (live→mainnet, sandbox→testnet); an omitted value defaults to the wallet's network. Ignored when it contradicts the environment.","example":"mainnet","type":"string"},"note":{"description":"Optional partner-supplied note to attach to the transaction","example":"Invoice 4471 payout","type":"string"},"sponsor":{"description":"Whether to have the network fee sponsored","type":"boolean"},"to_address":{"description":"Recipient address","example":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e","type":"string"},"treat_as_gross_amount":{"description":"Whether the amount is treated as gross (fee deducted from it) rather than net","type":"boolean"},"wallet_id":{"description":"Identifier of the wallet to send from","example":"f47ac10b-58cc-4372-a567-0e02b2c3d479","format":"uuid","type":"string"}},"required":["wallet_id","to_address","amount","asset"],"type":"object"},"CreateWalletRequest":{"properties":{"chain":{"description":"Blockchain the wallet will operate on","example":"ethereum","type":"string"},"customer_ref_id":{"description":"Optional partner-supplied reference identifier for the wallet","example":"cust_8842","type":"string"},"metadata":{"additionalProperties":true,"description":"Arbitrary partner-supplied key/value metadata","type":"object"},"name":{"description":"Human-readable name for the wallet","example":"Treasury wallet","type":"string"},"network":{"deprecated":true,"description":"Deprecated. The environment determines the network (live→mainnet, sandbox→testnet); an omitted value defaults to the chain's network for this environment. Ignored when it contradicts the environment.","example":"mainnet","type":"string"},"vault_id":{"description":"Identifier of the existing vault the wallet belongs to","example":"f47ac10b-58cc-4372-a567-0e02b2c3d479","format":"uuid","type":"string"},"wallet_type":{"description":"Wallet type: hot, cold, or operational","enum":["hot","cold","operational"],"example":"hot","type":"string"}},"required":["name","chain","vault_id"],"type":"object"},"CreateWebhookRequest":{"properties":{"event_types":{"description":"Optional filter of event types to deliver; empty delivers every type. See GET /v1/webhooks/event-types.","items":{"type":"string"},"type":"array"},"name":{"description":"Human-readable name for the webhook endpoint.","example":"Production notifications","maxLength":255,"minLength":1,"type":"string"},"url":{"description":"HTTPS URL platform notifications are POSTed to.","example":"https://example.com/webhooks/bitnob","format":"uri","type":"string"}},"required":["name","url"],"type":"object"},"Decimal":{"properties":{},"type":"object"},"Error":{"description":"Standard error envelope.","properties":{"error":{"properties":{"code":{"type":"string"},"details":{"additionalProperties":true,"type":"object"},"message":{"type":"string"},"param":{"type":"string"},"request_id":{"type":"string"},"type":{"type":"string"}},"type":"object"}},"type":"object"},"EstimateTransactionFeeRequest":{"properties":{"amount":{"description":"Amount to send as a human-readable decimal in the asset's display unit","example":"25.5","type":"string"},"asset":{"description":"Asset to send — the asset ID (e.g. USDT_TRX, USDC_ETH, TRX) or, for a single-chain wallet, the bare symbol (e.g. USDT) which resolves to the wallet's chain. See GET /assets for the full list.","example":"USDT_TRX","type":"string"},"network":{"deprecated":true,"description":"Deprecated. The environment determines the network (live→mainnet, sandbox→testnet); an omitted value defaults to the wallet's network. Ignored when it contradicts the environment.","example":"mainnet","type":"string"},"sponsor":{"description":"Whether to estimate fees as if the network fee were sponsored","type":"boolean"},"to_address":{"description":"Recipient address","example":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e","type":"string"},"treat_as_gross_amount":{"description":"Whether the amount is treated as gross (fee deducted from it) rather than net","type":"boolean"},"wallet_id":{"description":"Identifier of the wallet the transaction would be sent from","example":"f47ac10b-58cc-4372-a567-0e02b2c3d479","format":"uuid","type":"string"}},"required":["wallet_id","to_address","amount","asset"],"type":"object"},"EventResponse":{"properties":{"created_at":{"description":"ISO-8601 time the event was generated.","example":"2026-05-16T10:30:00Z","format":"date-time","type":"string"},"delivered_at":{"description":"ISO-8601 time delivery succeeded; set once delivery_status is \"delivered\".","format":"date-time","type":"string"},"delivery_attempts":{"description":"Number of delivery attempts made so far.","example":1,"type":"integer"},"delivery_status":{"description":"Delivery status (e.g. pending, delivered, failed).","example":"delivered","type":"string"},"destination":{"description":"URL the event was POSTed to.","example":"https://example.com/webhooks/bitnob","type":"string"},"error_message":{"description":"Last delivery error, when a delivery attempt failed.","type":"string"},"http_status_code":{"description":"HTTP status returned by the destination; present once it has responded at least once.","example":200,"type":"integer"},"id":{"description":"Unique identifier of the delivery event.","example":"9b2e7a1c-3d4f-4a8b-9c0d-1e2f3a4b5c6d","type":"string"},"max_attempts":{"description":"Maximum delivery attempts before giving up; omitted when the pipeline has no retry ceiling.","example":5,"type":"integer"},"next_retry_at":{"description":"ISO-8601 time of the next scheduled retry, when one is pending.","format":"date-time","type":"string"},"object":{"description":"Object type discriminator; always \"event\".","example":"event","type":"string"},"type":{"description":"Event type that was delivered.","example":"transaction.confirmed","type":"string"},"webhook_id":{"description":"Identifier of the webhook/subscription the event belongs to.","example":"7c9e6679-7425-40de-944b-e07fc1f90ae7","type":"string"}},"type":"object"},"EventRetryResponse":{"properties":{"object":{"description":"Object type discriminator; always \"event_retry\".","example":"event_retry","type":"string"},"status":{"description":"Status of the re-queued delivery.","example":"queued","type":"string"}},"type":"object"},"FeeBreakdownItem":{"properties":{"key":{"description":"Machine-readable identifier of the component.","example":"base_fee","type":"string"},"label":{"description":"Human-readable label for the component.","example":"Base fee","type":"string"},"unit":{"description":"Unit the value is expressed in (asset symbol, sat/vB, etc.).","example":"ETH","type":"string"},"value":{"description":"Value of the component, in the unit named by unit.","example":"0.0009","type":"string"}},"type":"object"},"FeeEstimationResponse":{"properties":{"fee_levels":{"$ref":"#/components/schemas/FeeLevels","description":"Fee quotes at each speed tier (low/medium/high)."},"recommended":{"description":"The recommended fee level for this transaction: low, medium, or high.","example":"medium","type":"string"}},"type":"object"},"FeeFundingOption":{"properties":{"atomic_collection":{"description":"Whether fee collection is performed atomically with the transaction.","type":"boolean"},"available":{"description":"Whether this funding path is currently usable for the transaction.","type":"boolean"},"execution_control":{"description":"Which party controls execution under this funding path.","type":"string"},"execution_path":{"description":"How the transaction would be executed under this funding path.","type":"string"},"fee_asset_amount":{"description":"Amount you are charged as a display-unit decimal.","type":"string"},"fee_asset_amount_raw":{"description":"Amount you are charged, in the fee asset's smallest base unit.","type":"string"},"fee_asset_id":{"description":"Identifier of the asset you are charged in under this funding path.","type":"string"},"funding_model":{"description":"The funding model applied (e.g. gas station vs sponsorship).","type":"string"},"indicative":{"description":"Whether the quote is indicative (an estimate) rather than firm.","type":"boolean"},"network_fee_amount":{"description":"Underlying network fee as a display-unit decimal.","type":"string"},"network_fee_amount_raw":{"description":"Underlying network fee in the asset's smallest base unit.","type":"string"},"network_fee_asset_id":{"description":"Identifier of the asset the underlying network fee is paid in.","type":"string"},"network_fee_usd":{"description":"Approximate USD value of the underlying network fee.","type":"string"},"quote_expires_at":{"description":"ISO-8601 time after which this funding quote is no longer valid.","type":"string"},"recipient_amount":{"description":"Amount the recipient receives under this funding path (display unit).","type":"string"},"recipient_amount_raw":{"description":"Amount the recipient receives, in the asset's smallest base unit.","type":"string"},"status":{"description":"Machine-readable availability status of this funding path.","type":"string"},"status_label":{"description":"Human-readable availability status.","type":"string"},"total_debit_amount":{"description":"Total debited from the sender under this funding path (display unit).","type":"string"},"total_debit_amount_raw":{"description":"Total debited from the sender, in the asset's smallest base unit.","type":"string"},"unavailable_reason":{"description":"Why this funding path is unavailable, when available is false.","type":"string"}},"type":"object"},"FeeFundingOptions":{"properties":{"bitnob_sponsorship":{"$ref":"#/components/schemas/FeeFundingOption","description":"Funding the fee via Bitnob sponsorship (paymaster)."},"customer_gas_station":{"$ref":"#/components/schemas/FeeFundingOption","description":"Funding the fee from your own gas station."}},"type":"object"},"FeeLevelDetail":{"properties":{"amount":{"description":"Network fee as a human-readable decimal in the fee asset's display unit.","example":"0.0012","type":"string"},"amount_raw":{"description":"Network fee as an integer in the fee asset's smallest base unit.","example":"1200000000000000","type":"string"},"asset_id":{"description":"Identifier of the asset the fee is denominated in.","type":"string"},"breakdown":{"description":"Itemized components that make up this fee quote.","items":{"$ref":"#/components/schemas/FeeBreakdownItem"},"type":"array"},"estimated_time_seconds":{"description":"Estimated seconds until confirmation at this fee level.","example":30,"type":"integer"},"funding_options":{"$ref":"#/components/schemas/FeeFundingOptions","description":"Available ways to fund the network fee for this quote."},"recipient_amount":{"description":"Amount the recipient receives (display unit) when the fee is deducted from the send amount.","type":"string"},"recipient_amount_raw":{"description":"Amount the recipient receives, in the asset's smallest base unit.","type":"string"},"total_debit_amount":{"description":"Total debited from the sender (amount + fee) as a display-unit decimal.","type":"string"},"total_debit_amount_raw":{"description":"Total debited from the sender, in the asset's smallest base unit.","type":"string"},"usd_value":{"description":"Approximate USD value of the fee.","example":"3.45","type":"string"}},"type":"object"},"FeeLevels":{"properties":{"high":{"$ref":"#/components/schemas/FeeLevelDetail","description":"Most expensive, fastest quote."},"low":{"$ref":"#/components/schemas/FeeLevelDetail","description":"Cheapest, slowest quote."},"medium":{"$ref":"#/components/schemas/FeeLevelDetail","description":"Balanced quote."}},"type":"object"},"GasStationResponse":{"properties":{"address":{"description":"On-chain address holding the gas station's funds.","example":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e","type":"string"},"asset":{"description":"Symbol of the asset the gas station holds (the chain's native coin).","example":"ETH","type":"string"},"asset_decimals":{"description":"Number of decimals used to convert the balance's base units to the display unit.","example":18,"type":"integer"},"auto_refill_enabled":{"description":"Whether the gas station auto-refills when it drops below the threshold.","example":true,"type":"boolean"},"balance":{"description":"Current native-asset balance as an integer in the asset's smallest base unit.","example":"125000000000000000","type":"string"},"chain":{"description":"Blockchain the gas station funds fees on.","example":"ethereum","type":"string"},"created_at":{"description":"ISO-8601 time when the gas station was created.","example":"2026-05-16T10:30:00Z","format":"date-time","type":"string"},"gas_strategy":{"description":"Gas pricing strategy applied when sponsoring fees.","example":"standard","type":"string"},"health_status":{"description":"Health derived from balance versus threshold: \"healthy\" when at/above the threshold, \"low\" when below it.","example":"healthy","type":"string"},"id":{"description":"Unique identifier of the gas station.","example":"9b2e7a1c-3d4f-4a8b-9c0d-1e2f3a4b5c6d","type":"string"},"name":{"description":"Human-readable name of the gas station.","example":"Ethereum gas station","type":"string"},"network":{"description":"Network the gas station operates on.","example":"mainnet","type":"string"},"object":{"description":"Object type discriminator; always \"gas_station\".","example":"gas_station","type":"string"},"refill_amount":{"description":"Per-refill amount as a display-unit decimal.","example":"0.25","type":"string"},"refill_amount_raw":{"description":"Per-refill amount as an integer in the asset's smallest base unit.","example":"250000000000000000","type":"string"},"refill_from_wallet_id":{"description":"Identifier of the wallet auto-refills are funded from.","example":"f47ac10b-58cc-4372-a567-0e02b2c3d479","type":"string"},"status":{"description":"Current status of the gas station.","example":"active","type":"string"},"threshold":{"description":"Auto-refill threshold as a human-readable decimal in the display unit.","example":"0.05","type":"string"},"threshold_raw":{"description":"Auto-refill threshold as an integer in the asset's smallest base unit.","example":"50000000000000000","type":"string"},"updated_at":{"description":"ISO-8601 time when the gas station was last updated.","example":"2026-05-16T10:30:00Z","format":"date-time","type":"string"}},"type":"object"},"JSONRPCRequest":{"properties":{"id":{"description":"Client-supplied request identifier echoed back in the response.","example":"1"},"jsonrpc":{"description":"JSON-RPC protocol version; always \"2.0\".","example":"2.0","type":"string"},"method":{"description":"The RPC method to invoke.","example":"eth_blockNumber","type":"string"},"params":{"description":"Method-defined parameters; any JSON value."}},"type":"object"},"JSONRPCResponse":{"properties":{"error":{"description":"JSON-RPC error object on failure."},"id":{"description":"The request identifier this response corresponds to.","example":"1"},"jsonrpc":{"description":"JSON-RPC protocol version; always \"2.0\".","example":"2.0","type":"string"},"result":{"description":"Method result on success; any JSON value."}},"type":"object"},"NetworkFeeResponse":{"properties":{"asset_id":{"type":"string"},"chain":{"type":"string"},"fee_unit":{"type":"string"},"fees":{"$ref":"#/components/schemas/NetworkFeeTiers"},"object":{"type":"string"},"symbol":{"type":"string"}},"type":"object"},"NetworkFeeTier":{"properties":{"base_fee":{"type":"string"},"confirmation_time_secs":{"type":"integer"},"fee_per_byte":{"type":"string"},"fee_usd":{"type":"string"},"gas_price":{"type":"string"},"network_fee":{"type":"string"},"priority_fee":{"type":"string"}},"type":"object"},"NetworkFeeTiers":{"properties":{"high":{"$ref":"#/components/schemas/NetworkFeeTier"},"low":{"$ref":"#/components/schemas/NetworkFeeTier"},"medium":{"$ref":"#/components/schemas/NetworkFeeTier"}},"type":"object"},"OperatorMeta":{"properties":{"arity":{"type":"string"},"description":{"type":"string"},"name":{"type":"string"},"value_shape":{"type":"string"}},"type":"object"},"PolicySchemaResponse":{"properties":{"action_types":{"description":"Valid rule action types and their metadata.","items":{"$ref":"#/components/schemas/ActionTypeMeta"},"type":"array"},"categories":{"description":"Valid policy categories and their metadata.","items":{"$ref":"#/components/schemas/CategoryMeta"},"type":"array"},"condition_fields":{"description":"Fields a condition may compare against, and their metadata.","items":{"$ref":"#/components/schemas/ConditionFieldMeta"},"type":"array"},"object":{"description":"Object type discriminator; always \"policy_schema\".","example":"policy_schema","type":"string"},"operators":{"description":"Valid condition operators and their metadata.","items":{"$ref":"#/components/schemas/OperatorMeta"},"type":"array"}},"type":"object"},"PublicActivatePolicyRequest":{"properties":{"comment":{"description":"Optional comment recorded against the approval request for audit purposes.","example":"Activating after security review","maxLength":500,"type":"string"}},"type":"object"},"PublicAuditLogResponse":{"properties":{"action":{"description":"The action that was recorded (e.g. created, updated, activated).","example":"created","type":"string"},"actor_id":{"description":"Identifier of the actor who performed the action.","example":"3f1a2b3c-4d5e-6f7a-8b9c-0d1e2f3a4b5c","type":"string"},"actor_name":{"description":"Display name of the actor who performed the action.","example":"Ebot Ndip","type":"string"},"changes":{"additionalProperties":true,"description":"Map of fields changed by the action, when applicable.","type":"object"},"created_at":{"description":"Timestamp when the audit entry was recorded.","example":"2026-05-16T10:30:00Z","format":"date-time","type":"string"},"id":{"description":"Unique identifier of the audit log entry.","example":"9b2e7a1c-3d4f-4a8b-9c0d-1e2f3a4b5c6d","type":"string"},"metadata":{"additionalProperties":true,"description":"Additional contextual metadata for the audit entry.","type":"object"},"object":{"description":"Object type discriminator; always \"policy_audit_log\".","example":"policy_audit_log","type":"string"},"policy_id":{"description":"Identifier of the policy this entry relates to.","example":"a1b2c3d4-5e6f-7a8b-9c0d-1e2f3a4b5c6d","type":"string"}},"type":"object"},"PublicConditionRequest":{"properties":{"field":{"description":"The request attribute the condition compares against; validated against the backend's allowlist of fields.","example":"amount_usd","type":"string"},"max":{"description":"Range upper bound, used with between/not_between operators.","example":"500"},"min":{"description":"Range lower bound, used with between/not_between operators.","example":"100"},"operator":{"description":"Comparison operator applied to the field.","enum":["equal","not_equal","greater_than","less_than","greater_than_or_equal","less_than_or_equal","between","not_between","in","not_in","contains"],"example":"greater_than","type":"string"},"value":{"description":"Scalar comparison value, used with single-operand operators.","example":"10000"},"values":{"description":"Set of values, used with in/not_in operators.","example":"[\"BTC\",\"ETH\"]","items":{},"type":"array"}},"required":["field","operator"],"type":"object"},"PublicConditionResponse":{"properties":{"field":{"description":"The request attribute the condition compares against.","example":"amount_usd","type":"string"},"max":{"description":"Range upper bound for between/not_between operators.","example":"500"},"min":{"description":"Range lower bound for between/not_between operators.","example":"100"},"operator":{"description":"Comparison operator applied to the field.","example":"greater_than","type":"string"},"value":{"description":"Scalar comparison value for single-operand operators.","example":"10000"},"values":{"description":"Set of allowed (or disallowed) values for in/not_in operators.","example":"[\"BTC\",\"ETH\"]","items":{},"type":"array"}},"type":"object"},"PublicConsolidationAsset":{"properties":{"contract_address":{"type":"string"},"is_native":{"type":"boolean"},"min_amount_to_move":{"$ref":"#/components/schemas/Decimal"},"min_balance_to_leave":{"$ref":"#/components/schemas/Decimal"},"symbol":{"type":"string"}},"type":"object"},"PublicConsolidationAssetTotal":{"properties":{"amount_swept":{"$ref":"#/components/schemas/Decimal"},"asset_address":{"type":"string"},"asset_symbol":{"type":"string"},"sweep_count":{"type":"integer"}},"type":"object"},"PublicConsolidationFeeLine":{"properties":{"amount":{"$ref":"#/components/schemas/Decimal"},"amount_usd":{"$ref":"#/components/schemas/Decimal"},"currency":{"type":"string"},"kind":{"type":"string"}},"type":"object"},"PublicConsolidationRuleResponse":{"properties":{"active_run_id":{"type":"string"},"assets":{"items":{"$ref":"#/components/schemas/PublicConsolidationAsset"},"type":"array"},"chain":{"type":"string"},"created_at":{"type":"string"},"destination_address_book_id":{"type":"string"},"destination_type":{"type":"string"},"destination_vault_id":{"type":"string"},"enabled":{"type":"boolean"},"gas_source":{"type":"string"},"gas_station_id":{"type":"string"},"id":{"type":"string"},"in_flight_sweeps":{"type":"integer"},"min_consolidate_usd":{"$ref":"#/components/schemas/Decimal"},"network":{"type":"string"},"object":{"type":"string"},"org_id":{"type":"string"},"schedule_cron":{"type":"string"},"threshold_basis":{"type":"string"},"threshold_currency":{"type":"string"},"threshold_value":{"$ref":"#/components/schemas/Decimal"},"trigger_type":{"type":"string"},"updated_at":{"type":"string"},"vault_id":{"type":"string"}},"type":"object"},"PublicConsolidationRunFees":{"properties":{"breakdown":{"items":{"$ref":"#/components/schemas/PublicConsolidationFeeLine"},"type":"array"},"total_usd":{"$ref":"#/components/schemas/Decimal"}},"type":"object"},"PublicConsolidationRunResponse":{"properties":{"addresses_scanned":{"type":"integer"},"chain":{"type":"string"},"completed_at":{"type":"string"},"created_at":{"type":"string"},"fees":{"$ref":"#/components/schemas/PublicConsolidationRunFees"},"id":{"type":"string"},"initiated_by_user_id":{"type":"string"},"network":{"type":"string"},"object":{"type":"string"},"org_id":{"type":"string"},"per_asset_totals":{"items":{"$ref":"#/components/schemas/PublicConsolidationAssetTotal"},"type":"array"},"rule_id":{"type":"string"},"started_at":{"type":"string"},"status":{"type":"string"},"transfers_confirmed":{"type":"integer"},"transfers_created":{"type":"integer"},"transfers_failed":{"type":"integer"},"trigger_source":{"type":"string"},"updated_at":{"type":"string"},"vault_id":{"type":"string"}},"type":"object"},"PublicConsolidationSweepResponse":{"properties":{"amount":{"$ref":"#/components/schemas/Decimal"},"asset_address":{"type":"string"},"asset_symbol":{"type":"string"},"chain":{"type":"string"},"created_at":{"type":"string"},"destination_address":{"type":"string"},"failure_reason":{"type":"string"},"gas_source":{"type":"string"},"id":{"type":"string"},"is_native":{"type":"boolean"},"network":{"type":"string"},"object":{"type":"string"},"org_id":{"type":"string"},"rule_id":{"type":"string"},"run_id":{"type":"string"},"source_address_id":{"type":"string"},"status":{"type":"string"},"transaction_id":{"type":"string"},"tx_hash":{"type":"string"},"updated_at":{"type":"string"}},"type":"object"},"PublicCreateConsolidationRuleRequest":{"properties":{"assets":{"items":{"$ref":"#/components/schemas/PublicConsolidationAsset"},"type":"array"},"chain":{"type":"string"},"destination_address_book_id":{"format":"uuid","type":"string"},"destination_type":{"enum":["address_book","vault"],"type":"string"},"destination_vault_id":{"format":"uuid","type":"string"},"enabled":{"type":"boolean"},"gas_source":{"enum":["hedge_paymaster","customer_gas_station","wallet"],"type":"string"},"gas_station_id":{"format":"uuid","type":"string"},"min_consolidate_usd":{"$ref":"#/components/schemas/Decimal"},"network":{"type":"string"},"schedule_cron":{"maxLength":100,"type":"string"},"threshold_basis":{"enum":["aggregate","per_address"],"type":"string"},"threshold_currency":{"enum":["usd","token"],"type":"string"},"threshold_value":{"$ref":"#/components/schemas/Decimal"},"trigger_type":{"enum":["threshold","scheduled","manual"],"type":"string"},"vault_id":{"format":"uuid","type":"string"}},"required":["vault_id","chain","destination_type","trigger_type","gas_source"],"type":"object"},"PublicCreatePolicyRequest":{"properties":{"category":{"description":"Policy category controlling how it is evaluated; defaults to \"access\" when omitted.","enum":["access","whitelist","limits","approvals","velocity","compliance","quorum"],"example":"approvals","type":"string"},"description":{"description":"Optional free-text summary of the policy's intent.","example":"Require approval for transfers above $10k","maxLength":1000,"type":"string"},"name":{"description":"Human-readable name of the policy (2–100 characters).","example":"High-value transfer review","maxLength":100,"minLength":2,"type":"string"},"rules":{"description":"Optional list of inline rules; rules can also be added later via the rule endpoints.","items":{"$ref":"#/components/schemas/PublicCreateRuleRequest"},"type":"array"}},"required":["name"],"type":"object"},"PublicCreateRuleRequest":{"properties":{"action_config":{"description":"Type-specific configuration for the action; shape depends on action_type.","items":{"type":"string"},"type":"array"},"action_type":{"description":"Action taken when the rule matches: allow, block, require_approval, alert, or delay.","enum":["allow","block","require_approval","alert","delay"],"example":"require_approval","type":"string"},"conditions":{"description":"Conditions that must all match for the rule to apply; optional on a draft, required when activating.","items":{"$ref":"#/components/schemas/PublicConditionRequest"},"type":"array"},"description":{"description":"Optional free-text summary of the rule's intent.","maxLength":1000,"type":"string"},"name":{"description":"Human-readable name of the rule (2–255 characters).","example":"Block large transfers","maxLength":255,"minLength":2,"type":"string"},"order":{"description":"Position of the rule in the policy's first-match-wins evaluation order; appended in creation order when omitted.","type":"integer"}},"required":["name","action_type"],"type":"object"},"PublicDiagnostic":{"properties":{"code":{"description":"Stable machine-readable code for the finding.","example":"unreachable_rule","type":"string"},"message":{"description":"Human-readable description of the finding.","type":"string"},"rule_id":{"description":"Identifier of the rule the finding relates to, when validating stored rules.","type":"string"},"rule_index":{"description":"Zero-based index of the rule the finding relates to.","example":0,"type":"integer"},"severity":{"description":"Severity of the finding: error, warning, or info.","example":"warning","type":"string"},"suggested_fix":{"description":"Suggested remediation, when available.","type":"string"}},"type":"object"},"PublicDraftRuleRequest":{"properties":{"action_config":{"description":"Type-specific configuration for the action; shape depends on action_type.","items":{"type":"string"},"type":"array"},"action_type":{"description":"Action taken when the rule matches: allow, block, require_approval, alert, or delay.","example":"require_approval","type":"string"},"conditions":{"description":"Conditions that must all match for the rule to apply.","items":{"$ref":"#/components/schemas/PublicConditionRequest"},"type":"array"},"description":{"description":"Optional description of the rule.","type":"string"},"name":{"description":"Optional name of the rule.","example":"Block large transfers","type":"string"},"order":{"description":"Position of the rule in first-match-wins evaluation order.","example":1,"type":"integer"}},"required":["action_type"],"type":"object"},"PublicEvaluateRequest":{"properties":{"actor_id":{"description":"Specific API key ID or user ID of the initiator.","type":"string"},"actor_type":{"description":"Initiator class: apikey or session. Empty means rules on actor_type won't match.","type":"string"},"amount":{"description":"Amount as a human-readable decimal in the asset's display unit.","type":"string"},"amount_raw":{"description":"Amount as an integer in the asset's smallest base unit.","type":"string"},"amount_usd":{"description":"Approximate USD value of the amount, for USD-threshold rules.","type":"string"},"asset_symbol":{"description":"Symbol of the asset involved.","type":"string"},"automation_rule_id":{"description":"Identifier of the automation rule driving the operation, when automated.","type":"string"},"chain":{"description":"Blockchain the synthetic operation is on.","type":"string"},"connection_id":{"description":"Identifier of the connection the operation flows through, if any.","type":"string"},"destination_type":{"description":"Destination classification for the operation.","type":"string"},"from_address":{"description":"Sender address of the synthetic operation.","type":"string"},"is_automated":{"description":"Whether the operation is initiated by automation rather than a user.","type":"boolean"},"network":{"description":"Network the synthetic operation is on.","type":"string"},"operation_type":{"description":"Operation being evaluated (e.g. the transaction/operation type).","type":"string"},"policy_id":{"description":"Evaluate against this specific policy (any state) instead of the currently-enforced one. Absent uses the enforced policy.","type":"string"},"source_type":{"description":"Source classification of the funds/operation.","type":"string"},"to_address":{"description":"Recipient address of the synthetic operation.","type":"string"},"token_address":{"description":"Token contract address, for token operations.","type":"string"},"tx_type":{"description":"Transaction type of the synthetic operation.","type":"string"},"user_id":{"description":"Initiating user, for rules conditioning on the user.","type":"string"},"vault_id":{"description":"Vault the synthetic operation targets.","type":"string"},"wallet_id":{"description":"Wallet the synthetic operation targets.","type":"string"}},"type":"object"},"PublicEvaluateResponse":{"properties":{"allowed":{"description":"Whether the synthetic request would be allowed.","example":false,"type":"boolean"},"delay_minutes":{"description":"Delay in minutes applied by a delay-action rule.","type":"integer"},"expiry_hours":{"description":"Approval expiry window in hours, when approval is required.","type":"integer"},"policy_id":{"description":"Identifier of the policy that produced the decision.","type":"string"},"reason":{"description":"Human-readable explanation of the decision.","type":"string"},"required_approvals":{"description":"Number of approvals required (the N in N-of-M), when approval is required.","type":"integer"},"requires_approval":{"description":"True when the matched rule's action is require_approval.","type":"boolean"},"result":{"description":"Decision outcome: matched_rule, quorum, no_match, approved, rejected, awaiting_approval, or delayed.","example":"matched_rule","type":"string"},"rule_id":{"description":"Identifier of the specific rule that matched, if any.","type":"string"},"trace":{"description":"Per-rule evaluation trace; omitted on no_match / quorum-only paths.","items":{"$ref":"#/components/schemas/PublicRuleTraceEntry"},"type":"array"}},"type":"object"},"PublicIssueCount":{"properties":{"error":{"description":"Number of error-severity diagnostics.","example":0,"type":"integer"},"info":{"description":"Number of info-severity diagnostics.","example":0,"type":"integer"},"warning":{"description":"Number of warning-severity diagnostics.","example":1,"type":"integer"}},"type":"object"},"PublicPendingActivationResponse":{"properties":{"approval_request_id":{"description":"Identifier of the approval request, for correlation in the dashboard and webhook events. Not a pollable public endpoint.","example":"9b2e7a1c-3d4f-4a8b-9c0d-1e2f3a4b5c6d","type":"string"},"expires_at":{"description":"ISO-8601 time at which the approval request expires; if it lapses the policy stays draft.","example":"2026-05-17T10:30:00Z","type":"string"},"message":{"description":"Human-readable explanation of the next steps.","type":"string"},"policy_id":{"description":"The policy awaiting activation. Poll GET /v1/policies/{policy_id} until status=enforced.","example":"f47ac10b-58cc-4372-a567-0e02b2c3d479","type":"string"},"required_approvals":{"description":"Number of approvals required before the policy becomes enforced.","example":2,"type":"integer"},"status":{"description":"Always \"pending_authorization\" for this response.","example":"pending_authorization","type":"string"}},"type":"object"},"PublicPolicyResponse":{"properties":{"category":{"description":"Policy category controlling how it is evaluated: access, whitelist, limits, approvals, velocity, compliance, or quorum.","example":"approvals","type":"string"},"created_at":{"description":"Timestamp when the policy was created.","example":"2026-05-16T10:30:00Z","format":"date-time","type":"string"},"created_by":{"description":"Identifier of the user who created the policy.","example":"3f1a2b3c-4d5e-6f7a-8b9c-0d1e2f3a4b5c","type":"string"},"created_by_name":{"description":"Display name of the user who created the policy.","example":"Ebot Ndip","type":"string"},"description":{"description":"Optional free-text summary of the policy's intent.","example":"Require approval for transfers above $10k","type":"string"},"id":{"description":"Unique identifier of the policy.","example":"a1b2c3d4-5e6f-7a8b-9c0d-1e2f3a4b5c6d","type":"string"},"is_active":{"description":"Back-compat flag; true when status is \"enforced\".","example":false,"type":"boolean"},"is_template":{"description":"Whether this policy is a reusable template.","example":false,"type":"boolean"},"name":{"description":"Human-readable name of the policy.","example":"High-value transfer review","type":"string"},"object":{"description":"Object type discriminator; always \"policy\".","example":"policy","type":"string"},"priority":{"description":"Evaluation priority of the policy relative to other policies.","example":100,"type":"integer"},"rule_count":{"description":"Number of rules contained in the policy.","example":2,"type":"integer"},"rules":{"description":"The policy's rules, when expanded.","items":{"$ref":"#/components/schemas/PublicRuleResponse"},"type":"array"},"status":{"description":"Canonical lifecycle status: draft, enforced, or archived.","example":"draft","type":"string"},"template_id":{"description":"Identifier of the template this policy was created from, if any.","example":"f47ac10b-58cc-4372-a567-0e02b2c3d479","type":"string"},"updated_at":{"description":"Timestamp when the policy was last updated.","example":"2026-05-16T10:30:00Z","format":"date-time","type":"string"}},"type":"object"},"PublicRuleResponse":{"properties":{"action_config":{"description":"Type-specific configuration for the action; shape depends on action_type."},"action_type":{"description":"Action taken when the rule matches: allow, block, require_approval, alert, or delay.","example":"require_approval","type":"string"},"conditions":{"description":"Conditions that must all match for the rule to apply.","items":{"$ref":"#/components/schemas/PublicConditionResponse"},"type":"array"},"created_at":{"description":"Timestamp when the rule was created.","example":"2026-05-16T10:30:00Z","format":"date-time","type":"string"},"description":{"description":"Optional free-text summary of the rule's intent.","type":"string"},"id":{"description":"Unique identifier of the rule.","example":"7c9e6679-7425-40de-944b-e07fc1f90ae7","type":"string"},"name":{"description":"Human-readable name of the rule.","example":"Block large transfers","type":"string"},"object":{"description":"Object type discriminator; always \"rule\".","example":"rule","type":"string"},"order":{"description":"Position of the rule in the policy's first-match-wins evaluation order.","example":1,"type":"integer"},"priority":{"description":"Evaluation priority of the rule.","example":50,"type":"integer"},"updated_at":{"description":"Timestamp when the rule was last updated.","example":"2026-05-16T10:30:00Z","format":"date-time","type":"string"}},"type":"object"},"PublicRuleTraceEntry":{"properties":{"action":{"description":"Action the rule would take when matched.","type":"string"},"failed_condition":{"$ref":"#/components/schemas/PublicRuleTraceFailedCondition","description":"The first condition that failed, when the rule did not match."},"matched":{"description":"Whether all of the rule's conditions matched.","type":"boolean"},"note":{"description":"Additional note about this rule's evaluation.","type":"string"},"reason":{"description":"Why the rule matched or did not match.","type":"string"},"rule_id":{"description":"Identifier of the rule.","type":"string"},"rule_index":{"description":"Zero-based position of the rule in evaluation order.","example":0,"type":"integer"},"rule_name":{"description":"Name of the rule.","type":"string"},"terminal":{"description":"Whether evaluation stopped at this rule (first-match-wins).","type":"boolean"}},"type":"object"},"PublicRuleTraceFailedCondition":{"properties":{"actual":{"description":"Actual value seen during evaluation.","example":"500","type":"string"},"expected":{"description":"Value the condition expected.","example":"10000","type":"string"},"field":{"description":"The request attribute the failed condition compared.","example":"amount_usd","type":"string"},"operator":{"description":"Operator of the failed condition.","example":"greater_than","type":"string"}},"type":"object"},"PublicUpdateConsolidationRuleRequest":{"properties":{"assets":{"items":{"$ref":"#/components/schemas/PublicConsolidationAsset"},"type":"array"},"destination_address_book_id":{"format":"uuid","type":"string"},"destination_type":{"enum":["address_book","vault"],"type":"string"},"destination_vault_id":{"format":"uuid","type":"string"},"enabled":{"type":"boolean"},"gas_source":{"enum":["hedge_paymaster","customer_gas_station","wallet"],"type":"string"},"gas_station_id":{"format":"uuid","type":"string"},"min_consolidate_usd":{"$ref":"#/components/schemas/Decimal"},"schedule_cron":{"maxLength":100,"type":"string"},"threshold_basis":{"enum":["aggregate","per_address"],"type":"string"},"threshold_currency":{"enum":["usd","token"],"type":"string"},"threshold_value":{"$ref":"#/components/schemas/Decimal"},"trigger_type":{"enum":["threshold","scheduled","manual"],"type":"string"}},"type":"object"},"PublicUpdatePolicyRequest":{"properties":{"category":{"description":"New category for the policy; omit to leave unchanged.","enum":["access","whitelist","limits","approvals","velocity","compliance","quorum"],"example":"approvals","type":"string"},"description":{"description":"New description for the policy; omit to leave unchanged.","example":"Require approval for transfers above $10k","maxLength":1000,"type":"string"},"name":{"description":"New name for the policy (2–100 characters); omit to leave unchanged.","example":"High-value transfer review","maxLength":100,"minLength":2,"type":"string"}},"type":"object"},"PublicUpdateRuleRequest":{"properties":{"action_config":{"description":"Type-specific configuration for the action; shape must match action_type when provided.","items":{"type":"string"},"type":"array"},"action_type":{"description":"New action type; when provided, must match the action_config shape. Omit to leave unchanged.","example":"require_approval","type":"string"},"conditions":{"description":"Replacement set of conditions; omit to leave conditions unchanged.","items":{"$ref":"#/components/schemas/PublicConditionRequest"},"type":"array"},"description":{"description":"New description for the rule; omit to leave unchanged.","maxLength":1000,"type":"string"},"name":{"description":"New name for the rule (2–255 characters); omit to leave unchanged.","example":"Block large transfers","maxLength":255,"minLength":2,"type":"string"},"order":{"description":"New position of the rule in the policy's evaluation order; omit to leave unchanged.","type":"integer"}},"type":"object"},"PublicValidateDraftRequest":{"properties":{"description":{"description":"Optional description of the draft policy.","type":"string"},"name":{"description":"Optional name of the draft policy being validated.","example":"High-value transfer review","type":"string"},"rules":{"description":"The in-flight rules to validate.","items":{"$ref":"#/components/schemas/PublicDraftRuleRequest"},"type":"array"}},"type":"object"},"PublicValidationResult":{"properties":{"diagnostics":{"description":"Individual validation findings.","items":{"$ref":"#/components/schemas/PublicDiagnostic"},"type":"array"},"issue_count":{"$ref":"#/components/schemas/PublicIssueCount","description":"Counts of diagnostics by severity."},"valid":{"description":"Whether the policy/rules passed validation with no errors.","example":true,"type":"boolean"}},"type":"object"},"RefillGasStationRequest":{"properties":{"amount":{"description":"Amount to transfer into the gas station, as a display-unit decimal.","example":"0.25","type":"string"},"source_wallet_id":{"description":"Identifier of the wallet to fund the refill from.","example":"f47ac10b-58cc-4372-a567-0e02b2c3d479","format":"uuid","type":"string"}},"required":["source_wallet_id","amount"],"type":"object"},"SignPayloadRequest":{"properties":{"address_id":{"description":"Identifier of the address whose key signs the payload","example":"3f1a2b3c-4d5e-6f7a-8b9c-0d1e2f3a4b5c","format":"uuid","type":"string"},"hash_function":{"description":"Hash function applied before signing: no_op, sha256, keccak256, or not_applicable","enum":["no_op","sha256","keccak256","not_applicable"],"example":"no_op","type":"string"},"payload":{"description":"Payload to sign, encoded per payload_encoding","example":"9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08","maxLength":65536,"type":"string"},"payload_encoding":{"description":"Encoding of the payload: hexadecimal (default) or text_utf8","enum":["hexadecimal","text_utf8"],"example":"hexadecimal","type":"string"}},"required":["payload"],"type":"object"},"SignatureResponse":{"properties":{"activity_id":{"description":"Identifier of the underlying signing activity","example":"activity-id","type":"string"},"address":{"description":"On-chain address whose key produced the signature","example":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e","type":"string"},"address_id":{"description":"Identifier of the address whose key produced the signature","example":"3f1a2b3c-4d5e-6f7a-8b9c-0d1e2f3a4b5c","type":"string"},"algorithm":{"description":"Signing algorithm (e.g. ecdsa)","example":"ecdsa","type":"string"},"chain":{"description":"Blockchain associated with the signing key","example":"ethereum","type":"string"},"curve":{"description":"Elliptic curve used (e.g. secp256k1, ed25519)","example":"secp256k1","type":"string"},"hash_function":{"description":"Hash function applied before signing","example":"no_op","type":"string"},"network":{"description":"Network associated with the signing key","example":"mainnet","type":"string"},"object":{"description":"Object type, always \"signature\"","example":"signature","type":"string"},"payload":{"description":"Payload that was signed","example":"9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08","type":"string"},"payload_encoding":{"description":"Encoding of the payload","example":"hexadecimal","type":"string"},"r":{"description":"ECDSA signature r component","example":"0x1","type":"string"},"recovery_id":{"description":"Public-key recovery identifier","example":0,"type":"integer"},"s":{"description":"ECDSA signature s component","example":"0x2","type":"string"},"signature":{"description":"The produced signature","example":"0x...","type":"string"},"signature_encoding":{"description":"Encoding of the signature","example":"hexadecimal","type":"string"},"signature_format":{"description":"Format of the signature (e.g. secp256k1_recoverable_65)","example":"secp256k1_recoverable_65","type":"string"},"signed_at":{"description":"ISO-8601 timestamp when the payload was signed","example":"2026-05-16T10:30:00Z","format":"date-time","type":"string"},"signed_payload":{"description":"The payload as signed (after any hashing)","example":"0x9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08","type":"string"},"signed_payload_encoding":{"description":"Encoding of the signed payload","example":"hexadecimal","type":"string"},"v":{"description":"ECDSA signature v (recovery) parameter","example":27,"type":"integer"},"wallet_id":{"description":"Identifier of the wallet whose key produced the signature","example":"a1b2c3d4-5e6f-7a8b-9c0d-1e2f3a4b5c6d","type":"string"}},"type":"object"},"SigningSecretResponse":{"properties":{"object":{"description":"Object type discriminator; always \"signing_secret\".","example":"signing_secret","type":"string"},"signing_secret":{"description":"The plaintext HMAC signing secret. Shown only in this response; store it securely.","type":"string"}},"type":"object"},"SponsorBroadcastRequest":{"properties":{"amount":{"description":"Transfer amount as a human-readable decimal in the asset's display unit.","example":"100","type":"string"},"asset":{"description":"Symbol of the asset being transferred.","example":"USDT","type":"string"},"fee_level":{"description":"Desired fee level for the sponsorship: low, medium, or high.","example":"medium","type":"string"},"from_address":{"description":"Sender address of the external transaction.","example":"TQn9Y2khEsLJW1ChVWFMSMeRDow5KcbLSE","type":"string"},"network":{"description":"Network the transaction is on (e.g. mainnet).","example":"mainnet","type":"string"},"signed_tx":{"description":"The client-signed raw transaction to broadcast.","example":"0a02...","type":"string"},"to_address":{"description":"Recipient address of the external transaction.","example":"TWd4WrZ9wn84f5x1hZhL4DHvk738ns5jwb","type":"string"},"tx_hash":{"description":"Expected transaction hash, for correlation.","example":"e1f2c3...","type":"string"}},"required":["from_address","to_address","asset","amount","network","signed_tx"],"type":"object"},"SponsorBroadcastResponse":{"properties":{"broadcast_accepted":{"description":"Whether the network accepted the broadcast.","example":true,"type":"boolean"},"gas_station_id":{"description":"Identifier of the gas station that funded the fee.","example":"9b2e7a1c-3d4f-4a8b-9c0d-1e2f3a4b5c6d","type":"string"},"mode":{"description":"Sponsorship mode that was applied.","type":"string"},"object":{"description":"Object type discriminator; always \"sponsor_broadcast\".","example":"sponsor_broadcast","type":"string"},"root_sponsor_tx_id":{"description":"Identifier of the originating sponsorship transaction in a chained sponsorship.","type":"string"},"sponsor_amount_sun":{"description":"Sponsored amount in SUN (TRX base unit).","type":"string"},"sponsor_amount_trx":{"description":"Sponsored amount in TRX (display unit).","type":"string"},"sponsor_tx_id":{"description":"Identifier of the sponsorship (fee-funding) transaction.","type":"string"},"status":{"description":"Status of the sponsored broadcast.","example":"broadcasting","type":"string"},"tx_hash":{"description":"Hash of the broadcast transaction.","example":"e1f2c3...","type":"string"}},"type":"object"},"SubscriptionResponse":{"properties":{"address":{"description":"The monitored on-chain address.","example":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e","type":"string"},"chain":{"description":"Blockchain the address is on.","example":"ethereum","type":"string"},"created_at":{"description":"ISO-8601 time when the subscription was created.","example":"2026-05-16T10:30:00Z","format":"date-time","type":"string"},"event_type":{"description":"Event-type filter; empty means all on-chain event types.","example":"incoming_token_tx","type":"string"},"failure_reason":{"description":"Reason the subscription failed; populated only when status is \"failed\".","type":"string"},"has_signing_secret":{"description":"Whether a signing secret is configured for delivery verification.","example":true,"type":"boolean"},"id":{"description":"Unique identifier of the subscription.","example":"7c9e6679-7425-40de-944b-e07fc1f90ae7","type":"string"},"label":{"description":"Optional partner-facing label.","example":"Customer deposit monitor","type":"string"},"last_event_at":{"description":"ISO-8601 time of the most recent delivered event.","format":"date-time","type":"string"},"metadata":{"additionalProperties":true,"description":"Arbitrary partner-supplied key/value metadata.","type":"object"},"network":{"description":"Network the address is on.","example":"mainnet","type":"string"},"object":{"description":"Object type discriminator; always \"subscription\".","example":"subscription","type":"string"},"signing_secret":{"description":"Plaintext HMAC signing secret. Returned ONLY on create and rotate-secret — never on GET/list.","type":"string"},"status":{"description":"Current status of the subscription.","example":"active","type":"string"},"updated_at":{"description":"ISO-8601 time when the subscription was last updated.","example":"2026-05-16T10:30:00Z","format":"date-time","type":"string"},"webhook_url":{"description":"URL on-chain events are delivered to.","example":"https://example.com/webhooks/bitnob","type":"string"}},"type":"object"},"TransactionInput":{"properties":{"txid":{"description":"Transaction hash of the output to spend","example":"de64fb866d99a42d857698ec5c383c9eb8f8a9d2596fdf556a8bba95a5bcc070","maxLength":64,"minLength":64,"type":"string"},"vout":{"description":"Output index within that transaction","example":"0","type":"string"}},"required":["txid"],"type":"object"},"TransactionResponse":{"properties":{"amount":{"description":"Transferred amount as a human-readable decimal in the asset's display unit","example":"25.5","type":"string"},"amount_raw":{"description":"Transferred amount as an integer in the asset's smallest base unit","example":"25500000","type":"string"},"asset":{"description":"Symbol of the transferred asset","example":"USDC","type":"string"},"asset_decimals":{"description":"Number of decimals used to convert the asset's base units to its display unit","example":6,"type":"integer"},"block_hash":{"description":"Hash of the block the transaction was included in","example":"0x8f4c1b8e2a7d3f06c5b1a09e8d7c6f5e4d3c2b1a09f8e7d6c5b4a3928170615f","type":"string"},"block_number":{"description":"Number of the block the transaction was included in","example":21345678,"type":"integer"},"broadcast_at":{"description":"ISO-8601 timestamp when the transaction was broadcast to the network","example":"2026-05-16T10:30:02Z","format":"date-time","type":"string"},"chain":{"description":"Blockchain the transaction was made on","example":"ethereum","type":"string"},"completed_at":{"description":"ISO-8601 timestamp when the transaction reached a completed state","example":"2026-05-16T10:30:45Z","format":"date-time","type":"string"},"confirmations":{"description":"Number of block confirmations for the transaction","example":12,"type":"integer"},"created_at":{"description":"ISO-8601 timestamp when the transaction was created","example":"2026-05-16T10:30:00Z","format":"date-time","type":"string"},"direction":{"description":"Transaction direction relative to the wallet (e.g. inbound, outbound)","example":"outbound","type":"string"},"error_message":{"description":"Human-readable error message when the transaction failed","type":"string"},"execute_at":{"description":"When a policy-delayed transaction (status=delayed) is scheduled to execute. Present only while the transaction is time-locked.","example":"2026-05-16T11:30:00Z","format":"date-time","type":"string"},"fee_amount":{"description":"Estimated network fee as a human-readable decimal in the fee asset's display unit","example":"0.0012","type":"string"},"fee_amount_raw":{"description":"Estimated network fee as an integer in the fee asset's smallest base unit","example":"1200000000000000","type":"string"},"fee_asset":{"description":"Symbol of the asset fees are denominated in (usually the chain's native coin)","example":"ETH","type":"string"},"fee_decimals":{"description":"Number of decimals used to convert the fee asset's base units to its display unit","example":18,"type":"integer"},"from_address":{"description":"Sender address","example":"0x3f5CE5FBFe3E9af3971dD833D26bA9b5C936f0bE","type":"string"},"gas_station_id":{"description":"Identifier of the gas station used to fund the transaction's fees","example":"9b2e7a1c-3d4f-4a8b-9c0d-1e2f3a4b5c6d","type":"string"},"id":{"description":"Unique identifier of the transaction","example":"7c9e6679-7425-40de-944b-e07fc1f90ae7","type":"string"},"network":{"description":"Network the transaction was made on (e.g. mainnet)","example":"mainnet","type":"string"},"note":{"description":"Optional partner-supplied note attached to the transaction","example":"Invoice 4471 payout","type":"string"},"object":{"description":"Object type, always \"transaction\"","example":"transaction","type":"string"},"realized_fee_amount":{"description":"Actual network fee paid as a human-readable decimal in the fee asset's display unit","example":"0.001","type":"string"},"realized_fee_amount_raw":{"description":"Actual network fee paid as an integer in the fee asset's smallest base unit","example":"1000000000000000","type":"string"},"realized_fee_asset":{"description":"Symbol of the asset the realized fee is denominated in","example":"ETH","type":"string"},"realized_fee_decimals":{"description":"Number of decimals used to convert the realized fee asset's base units to its display unit","example":18,"type":"integer"},"signed_at":{"description":"ISO-8601 timestamp when the transaction was signed","example":"2026-05-16T10:30:01Z","format":"date-time","type":"string"},"sponsored":{"description":"Whether the transaction's network fee was sponsored","example":false,"type":"boolean"},"status":{"description":"Lifecycle state. Non-terminal: pending_signature, pending_authorization, delayed, signed, awaiting_sponsorship, broadcasting, confirming, pending_screening. Terminal: completed, failed, cancelled, rejected. Poll this endpoint until a terminal state; an empty tx_hash means it has not been broadcast yet.","enum":["pending_signature","pending_authorization","delayed","signed","awaiting_sponsorship","broadcasting","confirming","completed","failed","cancelled","rejected","pending_screening"],"example":"completed","type":"string"},"to_address":{"description":"Recipient address","example":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e","type":"string"},"tx_hash":{"description":"On-chain transaction hash; empty until the transaction is broadcast","example":"0x9f4c1b8e2a7d3f06c5b1a09e8d7c6f5e4d3c2b1a09f8e7d6c5b4a3928170615f","type":"string"},"tx_type":{"description":"Type of transaction","type":"string"},"wallet_id":{"description":"Identifier of the wallet the transaction belongs to","example":"a1b2c3d4-5e6f-7a8b-9c0d-1e2f3a4b5c6d","type":"string"}},"type":"object"},"UTXOResponse":{"properties":{"address":{"description":"Address owning this UTXO","example":"bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4","type":"string"},"block_height":{"description":"Confirming block height; null when unconfirmed","example":845120,"type":"integer"},"confirmations":{"description":"Block confirmations at the current tip","example":12,"type":"integer"},"confirmed":{"description":"Whether the coin has a confirming block","example":true,"type":"boolean"},"created_at":{"description":"When the UTXO record was created","format":"date-time","type":"string"},"derivation_path":{"description":"BIP32 derivation path of the owning address","example":"m/84'/0'/0'/0/5","type":"string"},"hold_status":{"description":"KYT disposition: none, screening, or rejected","example":"none","type":"string"},"is_change":{"description":"Whether this is our own change output","example":false,"type":"boolean"},"object":{"description":"Object type, always \"utxo\"","example":"utxo","type":"string"},"outpoint":{"description":"Convenience \"txid:vout\" outpoint string","example":"de64fb866d99a42d857698ec5c383c9eb8f8a9d2596fdf556a8bba95a5bcc070:0","type":"string"},"reserved":{"description":"Locked by an in-flight transaction","example":false,"type":"boolean"},"script_pubkey":{"description":"Output script (hex) — for offline PSBT building","example":"0014a1b2","type":"string"},"script_type":{"description":"Script type (p2wpkh, p2tr, p2sh-p2wpkh, p2pkh)","example":"p2wpkh","type":"string"},"spendable":{"description":"Selectable for a spend (matured, unheld, unreserved)","example":true,"type":"boolean"},"txid":{"description":"Transaction hash containing this output","example":"de64fb866d99a42d857698ec5c383c9eb8f8a9d2596fdf556a8bba95a5bcc070","type":"string"},"value":{"description":"Value in satoshis (string to avoid precision loss)","example":"90000","type":"string"},"vout":{"description":"Output index within that transaction","example":"0","type":"string"}},"type":"object"},"UpdateGasStationRequest":{"properties":{"auto_refill_enabled":{"description":"Enable or disable auto-refill.","type":"boolean"},"name":{"description":"New name for the gas station.","example":"Ethereum gas station","maxLength":100,"minLength":2,"type":"string"},"refill_amount":{"description":"New per-refill amount (display unit).","example":"0.25","type":"string"},"threshold":{"description":"New auto-refill threshold (display unit).","example":"0.05","type":"string"}},"type":"object"},"UpdateSubscriptionRequest":{"properties":{"event_type":{"description":"New event-type filter for the subscription.","example":"incoming_token_tx","type":"string"},"webhook_url":{"description":"New URL to deliver this subscription's events to.","example":"https://example.com/webhooks/bitnob","type":"string"}},"type":"object"},"UpdateWalletRequest":{"properties":{"metadata":{"additionalProperties":true,"description":"Arbitrary partner-supplied key/value metadata to set on the wallet","type":"object"},"name":{"description":"New human-readable name for the wallet","maxLength":100,"minLength":2,"type":"string"}},"type":"object"},"UpdateWebhookRequest":{"properties":{"event_types":{"description":"New event-type filter; empty delivers every type.","items":{"type":"string"},"type":"array"},"name":{"description":"New name for the webhook endpoint.","example":"Production notifications","maxLength":255,"minLength":1,"type":"string"},"url":{"description":"New delivery URL for the webhook endpoint.","example":"https://example.com/webhooks/bitnob","format":"uri","type":"string"}},"type":"object"},"VaultResponse":{"properties":{"created_at":{"description":"ISO-8601 time when the vault was created.","example":"2026-05-16T10:30:00Z","format":"date-time","type":"string"},"custody_type":{"description":"Custody model governing the vault.","type":"string"},"id":{"description":"Unique identifier of the vault.","example":"f47ac10b-58cc-4372-a567-0e02b2c3d479","type":"string"},"name":{"description":"Human-readable name of the vault.","example":"Treasury vault","type":"string"},"object":{"description":"Object type discriminator; always \"vault\".","example":"vault","type":"string"},"status":{"description":"Current status of the vault.","example":"active","type":"string"},"updated_at":{"description":"ISO-8601 time when the vault was last updated.","example":"2026-05-16T10:30:00Z","format":"date-time","type":"string"},"vault_type":{"description":"Type of the vault.","type":"string"},"wallet_count":{"description":"Number of wallets contained in the vault.","example":3,"type":"integer"}},"type":"object"},"WalletResponse":{"properties":{"addresses":{"description":"Addresses on the wallet; populated only when requested via expand[]=addresses","items":{"$ref":"#/components/schemas/AddressResponse"},"type":"array"},"chain":{"description":"Blockchain the wallet operates on","example":"ethereum","type":"string"},"created_at":{"description":"ISO-8601 timestamp when the wallet was created","example":"2026-05-16T10:30:00Z","format":"date-time","type":"string"},"customer_ref_id":{"description":"Partner-supplied reference identifier for the wallet","example":"cust_8842","type":"string"},"id":{"description":"Unique identifier of the wallet","example":"a1b2c3d4-5e6f-7a8b-9c0d-1e2f3a4b5c6d","type":"string"},"metadata":{"additionalProperties":true,"description":"Arbitrary partner-supplied key/value metadata","type":"object"},"name":{"description":"Human-readable name of the wallet","example":"Treasury wallet","type":"string"},"object":{"description":"Object type, always \"wallet\"","example":"wallet","type":"string"},"primary_address":{"description":"Wallet's preferred receive address; omitted when no address has been provisioned yet","example":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e","type":"string"},"status":{"description":"Current status of the wallet","example":"active","type":"string"},"updated_at":{"description":"ISO-8601 timestamp when the wallet was last updated","example":"2026-05-16T10:30:00Z","format":"date-time","type":"string"},"vault_id":{"description":"Identifier of the vault the wallet belongs to","example":"f47ac10b-58cc-4372-a567-0e02b2c3d479","type":"string"},"wallet_type":{"description":"Wallet type (e.g. hot, cold, operational)","example":"hot","type":"string"}},"type":"object"},"WebhookEventTypeResponse":{"properties":{"category":{"description":"Category the event type belongs to.","example":"transaction","type":"string"},"description":{"description":"Explanation of when the event is emitted.","type":"string"},"name":{"description":"Human-readable name of the event type.","example":"Transaction confirmed","type":"string"},"type":{"description":"Machine-readable event type identifier.","example":"transaction.confirmed","type":"string"}},"type":"object"},"WebhookResponse":{"properties":{"created_at":{"description":"ISO-8601 time when the webhook was created.","example":"2026-05-16T10:30:00Z","format":"date-time","type":"string"},"event_types":{"description":"Event-type filter; empty means all platform event types are delivered.","items":{"type":"string"},"type":"array"},"has_signing_secret":{"description":"Whether a signing secret is configured for delivery verification.","example":true,"type":"boolean"},"id":{"description":"Unique identifier of the webhook endpoint.","example":"7c9e6679-7425-40de-944b-e07fc1f90ae7","type":"string"},"last_triggered_at":{"description":"ISO-8601 time of the most recent delivery.","format":"date-time","type":"string"},"name":{"description":"Human-readable name of the webhook endpoint.","example":"Production notifications","type":"string"},"object":{"description":"Object type discriminator; always \"webhook\".","example":"webhook","type":"string"},"signing_secret":{"description":"Plaintext HMAC signing secret. Returned ONLY on create and rotate-secret — never on GET/list.","type":"string"},"status":{"description":"Current status of the webhook endpoint.","example":"active","type":"string"},"updated_at":{"description":"ISO-8601 time when the webhook was last updated.","example":"2026-05-16T10:30:00Z","format":"date-time","type":"string"},"url":{"description":"URL platform notifications are delivered to.","example":"https://example.com/webhooks/bitnob","type":"string"}},"type":"object"}},"securitySchemes":{"ApiKeyAuth":{"in":"header","name":"X-API-Key","type":"apiKey"}}},"info":{"description":"# Bitnob Enterprise API\n\nA high-performance Wallet-as-a-Service API for partners and developers:\nnon-custodial wallets, transactions, gas stations, on-chain subscriptions and\nplatform webhooks across multiple chains.\n\n## Authentication\n\nAuthenticate every request with your secret API key in the **X-API-Key**\nrequest header. Keys are scoped to one organization and carry a fixed set of\npermissions; an endpoint returns **403** when the key lacks the required\npermission. Treat the key as a credential — never expose it in a browser or\nmobile client.\n\n## Request tracing\n\nEvery response carries an **X-Request-Id** header. Log it, and quote it when\ncontacting support — it identifies the exact request in our systems.\n\n## Rate limits\n\nEvery response carries the current rate-limit state:\n\n- **X-RateLimit-Limit** — requests permitted in the current window.\n- **X-RateLimit-Remaining** — requests still available in this window.\n- **X-RateLimit-Reset** — Unix time (seconds) when the window resets.\n- **X-RateLimit-Scope** — the scope the limit was applied at.\n\nRead these proactively and slow down before you are throttled. When a limit is\nexceeded the API responds **429** with a **Retry-After** header (seconds to\nwait); retry only after that delay.\n\n## Idempotency\n\nSend an **Idempotency-Key** header (a unique value you generate, e.g. a UUID)\non **POST**, **PATCH** and **DELETE** requests so a network retry never\napplies the same change twice.\n\n- It is **required** on value-moving endpoints (creating transactions,\n  creating addresses, refilling and sponsor-broadcasting gas stations,\n  creating wallets); those return **400 idempotency_key_required** if absent.\n- Keys are retained for **24 hours**.\n- Retrying with the same key replays the original response byte-for-byte and\n  adds an **Idempotent-Replayed: true** header.\n- Reusing a key with a **different request body** is rejected with\n  **409 idempotency_conflict** — generate a fresh key per distinct operation.\n- Only successful (2xx) responses are stored, so a request that failed can be\n  safely retried with the same key.\n- An Idempotency-Key sent without authentication is rejected with **401**.\n\n## Pagination\n\nList endpoints are cursor-paginated. Parameters:\n\n- **limit** — page size; bounded by the endpoint maximum.\n- **starting_after** — return the page after this opaque cursor.\n- **ending_before** — return the page before this opaque cursor.\n\nSupplying both **starting_after** and **ending_before** is rejected with\n**400 ambiguous_cursor**. Every list response is the same envelope:\n\n    {\n      \"object\": \"list\",\n      \"data\": [ ... ],\n      \"has_more\": true,\n      \"next_cursor\": \"b3JnOjE2ODk...\",\n      \"url\": \"/wallets\"\n    }\n\nWhen **has_more** is true, pass **next_cursor** as **starting_after** to fetch\nthe following page. Cursors are opaque — do not parse or construct them.\n\n## Transaction lifecycle and async outcomes\n\nCreating a transaction (POST /v1/transactions) returns one of two outcomes:\n\n- **201 Created** — signed and submitted for broadcast.\n- **202 Accepted** — accepted but not yet executing. The body's **status** says why:\n  - **pending_authorization** — organization policy requires approval; the\n    transaction executes once approvers approve it.\n  - **delayed** — a policy time-lock holds the transaction until **execute_at**\n    (an ISO-8601 timestamp on the response), when it executes automatically.\n\n  In both cases the transaction is durably persisted and its funds are locked.\n\nA transaction's **status** moves through these states:\n\n- **Non-terminal**: pending_signature, pending_authorization, delayed, signed,\n  awaiting_sponsorship, broadcasting, confirming, pending_screening.\n- **Terminal**: completed, failed, cancelled, rejected.\n\nPoll **GET /v1/transactions/{id}** (or subscribe to a webhook) until the status\nis terminal. An empty **tx_hash** means the transaction has not been broadcast\non-chain yet; once broadcast, **confirmations** climbs until the transaction is\n**completed**.\n\n## Amounts and units\n\nAll monetary values are JSON **strings**, never numbers — parse them with a\ndecimal/big-number type, not a float, to avoid precision loss.\n\nEvery monetary value appears in two forms so you never have to guess decimals:\n\n- **amount** / **fee_amount** — human-readable decimal in the asset's display\n  unit (e.g. \"25.5\" USDC).\n- **amount_raw** / **fee_amount_raw** / wallet **balance** — the integer value\n  in the asset's smallest base unit (e.g. \"25500000\" for 25.5 USDC at 6\n  decimals). **balance** fields are ALWAYS base units.\n\n**asset_decimals** (and **fee_decimals**) give the conversion:\ndisplay = raw / 10^decimals. The fee is denominated in **fee_asset**, which for\nmost chains is the native coin (ETH, TRX, …) and differs from the transferred\nasset — always read **fee_asset**/**fee_decimals** rather than assuming. After a\ntransaction confirms, **realized_fee_amount**(_raw) carries the actual fee paid.\n\nTwo balance shapes:\n\n- **GET /v1/wallets/{id}/balances** — one row PER FUNDED ADDRESS (an HD wallet\n  has many addresses).\n- **GET /v1/wallets/{id}/balances/{asset}** — a single AGGREGATED total for that\n  asset across the wallet.\n\n## Fees\n\nControl the fee in one of two ways on transaction create and estimate:\n\n- **fee_level** — \"low\", \"medium\", or \"high\"; the platform picks a rate.\n- **fee_rate** / **max_fee_rate** — Bitcoin only, in sat/vB, for explicit\n  control with an optional cap (the transaction will not pay above\n  **max_fee_rate**).\n\nUse **POST /v1/transactions/estimate-fee** to preview low/medium/high quotes and\nany gas-funding options before sending.\n\n## Errors\n\nEvery error response is the same envelope:\n\n    {\n      \"error\": {\n        \"type\": \"invalid_request_error\",\n        \"code\": \"invalid_cursor\",\n        \"message\": \"starting_after is not a valid cursor\",\n        \"param\": \"starting_after\",\n        \"request_id\": \"req_01HX...\"\n      }\n    }\n\n**type** is the broad category; **code** is a stable, machine-readable\nidentifier — branch on **code**, show **message** to humans, and **param**\nnames the offending field when applicable.\n\n### Error code catalogue\n\n**invalid_request_error** (HTTP 400) — the request was malformed or failed\nvalidation: invalid_request, invalid_json, invalid_body, empty_body,\ntrailing_data, type_mismatch, unknown_field, missing_required_field,\ninvalid_id, invalid_cursor, ambiguous_cursor, invalid_expand, invalid_chain,\ninvalid_vault_id, wallet_chain_unknown, invalid_transaction_data,\namount_precision_loss, gas_station_low_balance, body_too_large,\nidempotency_key_required, idempotency_key_invalid, invalid_webhook_id,\nmethod_not_allowed.\n\n**authentication_error** (HTTP 401) — the request was not authenticated:\nnot_authenticated, auth_required, org_required.\n\n**permission_error** (HTTP 403) — the request is authenticated but not\npermitted: insufficient_permissions (the API key lacks the required\npermission), ip_not_allowed (the request's source IP is not in the key's IP\nallowlist).\n\n**not_found_error** (HTTP 404) — the addressed resource does not exist:\nnot_found, route_not_found, asset_not_found, event_not_found,\ngas_station_not_found, subscription_not_found, transaction_not_found,\nvault_not_found, wallet_not_found, address_not_found, webhook_not_found.\n\n**conflict_error** (HTTP 409) — the request conflicts with current state:\nconflict, idempotency_conflict, wallet_archived.\n\n**rate_limit_error** (HTTP 429) — too many requests: rate_limit_exceeded.\n\n**api_error** (HTTP 500) — an unexpected server error: request_error,\ninternal_error.\n\n**service_unavailable_error** (HTTP 503) — a dependency is unavailable;\nretry after the Retry-After delay: service_unavailable.\n\n## Webhook signature verification\n\nThe platform signs every webhook delivery with HMAC-SHA256 using the signing\nsecret issued when you create the webhook or subscription (and rotated via the\nrotate-secret endpoints — the plaintext secret is shown only once).\n\nThe signature covers the canonical JSON object below, where **data**,\n**event** and **timestamp** are the corresponding fields of the delivered\npayload and **timestamp** is Unix seconds:\n\n    {\"data\": \u003cdata\u003e, \"event\": \"\u003cevent\u003e\", \"timestamp\": \u003cunix_seconds\u003e}\n\nThe signed object contains ONLY those three keys — when verifying, build a\nfresh object from the delivery's data, event and timestamp and exclude the\nsignature field (and any other body fields) from the HMAC input. Serialize the\nkeys in lexical order (data, event, timestamp), matching Go's encoding/json.\nThe signature value is:\n\n    \"sha256=\" + hex( HMAC_SHA256(signing_secret, canonical_json) )\n\n**Platform webhooks** (created via /webhooks) carry this value in the\n**X-Webhook-Signature** response header. **On-chain subscription webhooks**\n(created via /subscriptions) carry it as a **signature** field inside the\ndelivered JSON body — there is no signature header.\n\nTo verify a delivery: recompute the signature from your stored secret and\ncompare it to the received value with a constant-time comparison. Reject the\ndelivery on mismatch, and reject deliveries whose **timestamp** is older than\nyour tolerance window (a few minutes is typical) to defend against replay.\n\n## Webhook event types\n\n**Platform notification webhooks** (/webhooks) deliver these event types:\nwallet.created, wallet.deleted, wallet.suspended, wallet_address.created,\ntransaction.created, transaction.signed, transaction.broadcasting,\ntransaction.confirmed, transaction.completed, transaction.received,\ntransaction.failed, transaction.cancelled, gas_station.low_balance,\ngas_station.critical_balance, gas_station.auto_refilled, session.created,\napi_key.created, api_key.deleted, policy.violation,\npolicy.created, policy.updated, policy.activated, policy.archived,\npolicy.deleted, policy.rule.added, policy.rule.updated, policy.rule.deleted,\nkyt.deposit.held, kyt.deposit.approved, kyt.deposit.rejected, kyt.deposit.blocked,\nkyt.withdrawal.blocked, kyt.sanctions.match, kyt.alert.escalated,\nkyt.screening.timeout, kyt.screening.requeued, kyt.screening.completed.\n\nUse **GET /v1/webhooks/event-types** for the authoritative machine-readable list.\n\n**On-chain subscription webhooks** (/subscriptions) deliver these event\ntypes: incoming_native_tx, incoming_token_tx, incoming_nft_transfer,\nincoming_internal_tx, outgoing_native_tx, outgoing_token_tx,\noutgoing_nft_transfer, outgoing_internal_tx, tx_failed, tx_pending,\nconfirmation_threshold_met, confirmation_finalized, contract_deployed,\ncontract_executed, balance_changed.\n\n## Versioning and deprecation\n\nPin the API version with the **API-Version** request header; omit it to take\nthe current default. Additive changes (new endpoints, new optional fields) are\nnot versioned and may appear at any time — write tolerant clients.\n\nWhen an operation or version is scheduled for removal it is marked\n**deprecated** in this specification, and its responses carry a\n**Deprecation** header plus a **Sunset** header (RFC 8594) giving the date\nafter which it stops functioning. Monitor those headers and migrate before the\nSunset date.","title":"Bitnob Enterprise API","version":"v1"},"openapi":"3.0.3","paths":{"/assets":{"get":{"description":"Returns all supported assets. Filterable by chain and type.","operationId":"getAssets","parameters":[{"description":"API version (defaults to the latest supported version if omitted).","in":"header","name":"API-Version","required":false,"schema":{"default":"v1","enum":["v1"],"type":"string"}},{"description":"Filter by chain (e.g. ethereum, bitcoin).","in":"query","name":"chain","required":false,"schema":{"type":"string"}},{"description":"Filter by asset type.","in":"query","name":"type","required":false,"schema":{"enum":["native","erc20","spl","trc20","bep20"],"type":"string"}}],"responses":{"200":{"content":{"application/json":{"example":{"data":[{"chain":"ethereum","decimals":6,"id":"usdc-ethereum","name":"USD Coin","object":"asset","symbol":"USDC","type":"erc20"}],"has_more":false,"next_cursor":"","object":"list","url":""},"schema":{"properties":{"data":{"items":{"$ref":"#/components/schemas/AssetResponse"},"type":"array"},"has_more":{"type":"boolean"},"next_cursor":{"description":"Opaque cursor for the next page; pass as starting_after. Present only when has_more is true.","type":"string"},"object":{"example":"list","type":"string"},"url":{"type":"string"}},"type":"object"}}},"description":"Success","headers":{"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix time (seconds) at which the rate-limit window resets.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"Scope the rate limit was applied at.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for this request; quote it in support requests.","schema":{"type":"string"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Authentication required"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Insufficient permissions"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limit exceeded","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Internal server error"}},"security":[{"ApiKeyAuth":[]}],"summary":"List assets","tags":["Assets"]}},"/assets/chains":{"get":{"description":"Returns all supported blockchain networks.","operationId":"getAssetsChains","parameters":[{"description":"API version (defaults to the latest supported version if omitted).","in":"header","name":"API-Version","required":false,"schema":{"default":"v1","enum":["v1"],"type":"string"}}],"responses":{"200":{"content":{"application/json":{"example":{"data":[{"id":"ethereum","name":"ethereum","networks":"[\"mainnet\"]","object":"chain"}],"has_more":false,"next_cursor":"","object":"list","url":""},"schema":{"properties":{"data":{"items":{"$ref":"#/components/schemas/ChainResponse"},"type":"array"},"has_more":{"type":"boolean"},"next_cursor":{"description":"Opaque cursor for the next page; pass as starting_after. Present only when has_more is true.","type":"string"},"object":{"example":"list","type":"string"},"url":{"type":"string"}},"type":"object"}}},"description":"Success","headers":{"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix time (seconds) at which the rate-limit window resets.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"Scope the rate limit was applied at.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for this request; quote it in support requests.","schema":{"type":"string"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Authentication required"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Insufficient permissions"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limit exceeded","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Internal server error"}},"security":[{"ApiKeyAuth":[]}],"summary":"List chains","tags":["Assets"]}},"/assets/{id}":{"get":{"description":"Returns a single asset by ID (e.g. ETH, USDC_ETH, BTC).","operationId":"getAssetsById","parameters":[{"description":"Asset ID","in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}},{"description":"API version (defaults to the latest supported version if omitted).","in":"header","name":"API-Version","required":false,"schema":{"default":"v1","enum":["v1"],"type":"string"}}],"responses":{"200":{"content":{"application/json":{"example":{"chain":"ethereum","decimals":6,"id":"usdc-ethereum","name":"USD Coin","object":"asset","symbol":"USDC","type":"erc20"},"schema":{"$ref":"#/components/schemas/AssetResponse"}}},"description":"Success","headers":{"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix time (seconds) at which the rate-limit window resets.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"Scope the rate limit was applied at.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for this request; quote it in support requests.","schema":{"type":"string"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Authentication required"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Insufficient permissions"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Not found"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limit exceeded","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Internal server error"}},"security":[{"ApiKeyAuth":[]}],"summary":"Get asset","tags":["Assets"]}},"/consolidation/rules/{id}":{"delete":{"description":"Soft-deletes a consolidation rule. Detaches it from its destination — a rule referencing a destination is the ONLY thing that blocks that destination's own delete, and removing the rule frees it.","operationId":"deleteConsolidationRulesById","parameters":[{"description":"Rule ID","in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}},{"description":"API version (defaults to the latest supported version if omitted).","in":"header","name":"API-Version","required":false,"schema":{"default":"v1","enum":["v1"],"type":"string"}},{"description":"Unique key (1-255 printable ASCII chars) used to safely retry write operations. Same key + body returns the cached response; same key + different body returns 409.","in":"header","name":"Idempotency-Key","required":false,"schema":{"maxLength":255,"minLength":1,"type":"string"}}],"responses":{"204":{"description":"No Content","headers":{"Idempotent-Replayed":{"description":"True when this response was replayed from an earlier request with the same Idempotency-Key.","schema":{"type":"boolean"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix time (seconds) at which the rate-limit window resets.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"Scope the rate limit was applied at.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for this request; quote it in support requests.","schema":{"type":"string"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Authentication required"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Insufficient permissions"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Not found"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Conflict"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limit exceeded","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Internal server error"}},"security":[{"ApiKeyAuth":[]}],"summary":"Delete consolidation rule","tags":["Meta"]},"get":{"description":"Returns a single consolidation rule by ID.","operationId":"getConsolidationRulesById","parameters":[{"description":"Rule ID","in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}},{"description":"API version (defaults to the latest supported version if omitted).","in":"header","name":"API-Version","required":false,"schema":{"default":"v1","enum":["v1"],"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicConsolidationRuleResponse"}}},"description":"Success","headers":{"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix time (seconds) at which the rate-limit window resets.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"Scope the rate limit was applied at.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for this request; quote it in support requests.","schema":{"type":"string"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Authentication required"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Insufficient permissions"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Not found"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limit exceeded","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Internal server error"}},"security":[{"ApiKeyAuth":[]}],"summary":"Get consolidation rule","tags":["Meta"]},"patch":{"description":"Partially updates a consolidation rule (assets, trigger, threshold, cron, gas source, destination, enabled). Re-runs the full validation suite against the merged shape.","operationId":"patchConsolidationRulesById","parameters":[{"description":"Rule ID","in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}},{"description":"API version (defaults to the latest supported version if omitted).","in":"header","name":"API-Version","required":false,"schema":{"default":"v1","enum":["v1"],"type":"string"}},{"description":"Unique key (1-255 printable ASCII chars) used to safely retry write operations. Same key + body returns the cached response; same key + different body returns 409.","in":"header","name":"Idempotency-Key","required":false,"schema":{"maxLength":255,"minLength":1,"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicUpdateConsolidationRuleRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicConsolidationRuleResponse"}}},"description":"Success","headers":{"Idempotent-Replayed":{"description":"True when this response was replayed from an earlier request with the same Idempotency-Key.","schema":{"type":"boolean"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix time (seconds) at which the rate-limit window resets.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"Scope the rate limit was applied at.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for this request; quote it in support requests.","schema":{"type":"string"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Authentication required"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Insufficient permissions"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Not found"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Conflict"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limit exceeded","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Internal server error"}},"security":[{"ApiKeyAuth":[]}],"summary":"Update consolidation rule","tags":["Meta"]}},"/consolidation/rules/{id}/disable":{"post":{"description":"Disables a consolidation rule. An in-flight run drains; no new runs are opened while disabled.","operationId":"postConsolidationRulesByIdDisable","parameters":[{"description":"Rule ID","in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}},{"description":"API version (defaults to the latest supported version if omitted).","in":"header","name":"API-Version","required":false,"schema":{"default":"v1","enum":["v1"],"type":"string"}},{"description":"Unique key (1-255 printable ASCII chars) used to safely retry write operations. Same key + body returns the cached response; same key + different body returns 409.","in":"header","name":"Idempotency-Key","required":false,"schema":{"maxLength":255,"minLength":1,"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicConsolidationRuleResponse"}}},"description":"Success","headers":{"Idempotent-Replayed":{"description":"True when this response was replayed from an earlier request with the same Idempotency-Key.","schema":{"type":"boolean"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix time (seconds) at which the rate-limit window resets.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"Scope the rate limit was applied at.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for this request; quote it in support requests.","schema":{"type":"string"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Authentication required"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Insufficient permissions"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Not found"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Conflict"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limit exceeded","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Internal server error"}},"security":[{"ApiKeyAuth":[]}],"summary":"Disable consolidation rule","tags":["Meta"]}},"/consolidation/rules/{id}/enable":{"post":{"description":"Re-enables a disabled consolidation rule. Re-runs the non-interactive-signing gate — a vault's delegated-key configuration can change while a rule sat disabled.","operationId":"postConsolidationRulesByIdEnable","parameters":[{"description":"Rule ID","in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}},{"description":"API version (defaults to the latest supported version if omitted).","in":"header","name":"API-Version","required":false,"schema":{"default":"v1","enum":["v1"],"type":"string"}},{"description":"Unique key (1-255 printable ASCII chars) used to safely retry write operations. Same key + body returns the cached response; same key + different body returns 409.","in":"header","name":"Idempotency-Key","required":false,"schema":{"maxLength":255,"minLength":1,"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicConsolidationRuleResponse"}}},"description":"Success","headers":{"Idempotent-Replayed":{"description":"True when this response was replayed from an earlier request with the same Idempotency-Key.","schema":{"type":"boolean"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix time (seconds) at which the rate-limit window resets.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"Scope the rate limit was applied at.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for this request; quote it in support requests.","schema":{"type":"string"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Authentication required"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Insufficient permissions"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Not found"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Conflict"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limit exceeded","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Internal server error"}},"security":[{"ApiKeyAuth":[]}],"summary":"Enable consolidation rule","tags":["Meta"]}},"/consolidation/rules/{id}/run":{"post":{"description":"Triggers a manual, on-demand evaluation of the rule (fans out sweeps for the in-scope assets). Rejected with 409 if a run is already active for this rule. If the vault can no longer sign non-interactively, the rule is paused as a side effect and the failure is reported as 403.","operationId":"postConsolidationRulesByIdRun","parameters":[{"description":"Rule ID","in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}},{"description":"API version (defaults to the latest supported version if omitted).","in":"header","name":"API-Version","required":false,"schema":{"default":"v1","enum":["v1"],"type":"string"}},{"description":"Unique key (1-255 printable ASCII chars) used to safely retry write operations. Same key + body returns the cached response; same key + different body returns 409.","in":"header","name":"Idempotency-Key","required":false,"schema":{"maxLength":255,"minLength":1,"type":"string"}}],"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicConsolidationRunResponse"}}},"description":"Created","headers":{"Idempotent-Replayed":{"description":"True when this response was replayed from an earlier request with the same Idempotency-Key.","schema":{"type":"boolean"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix time (seconds) at which the rate-limit window resets.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"Scope the rate limit was applied at.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for this request; quote it in support requests.","schema":{"type":"string"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Authentication required"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Insufficient permissions"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Not found"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Conflict"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limit exceeded","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Internal server error"}},"security":[{"ApiKeyAuth":[]}],"summary":"Run consolidation rule now","tags":["Meta"]}},"/consolidation/rules/{id}/runs":{"get":{"description":"Returns a paginated, most-recent-first history of runs for the rule.","operationId":"getConsolidationRulesByIdRuns","parameters":[{"description":"Rule ID","in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}},{"description":"API version (defaults to the latest supported version if omitted).","in":"header","name":"API-Version","required":false,"schema":{"default":"v1","enum":["v1"],"type":"string"}},{"description":"Opaque cursor; returns the page after this item.","in":"query","name":"starting_after","required":false,"schema":{"type":"string"}},{"description":"Opaque cursor; returns the page before this item.","in":"query","name":"ending_before","required":false,"schema":{"type":"string"}},{"description":"Page size; bounded by the endpoint maximum.","in":"query","name":"limit","required":false,"schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"example":{"data":[],"has_more":false,"next_cursor":"","object":"list","url":""},"schema":{"properties":{"data":{"items":{"$ref":"#/components/schemas/PublicConsolidationRunResponse"},"type":"array"},"has_more":{"type":"boolean"},"next_cursor":{"description":"Opaque cursor for the next page; pass as starting_after. Present only when has_more is true.","type":"string"},"object":{"example":"list","type":"string"},"url":{"type":"string"}},"type":"object"}}},"description":"Success","headers":{"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix time (seconds) at which the rate-limit window resets.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"Scope the rate limit was applied at.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for this request; quote it in support requests.","schema":{"type":"string"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Authentication required"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Insufficient permissions"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Not found"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limit exceeded","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Internal server error"}},"security":[{"ApiKeyAuth":[]}],"summary":"List consolidation runs for a rule","tags":["Meta"]}},"/consolidation/runs/{id}":{"get":{"description":"Returns a single consolidation run by ID.","operationId":"getConsolidationRunsById","parameters":[{"description":"Run ID","in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}},{"description":"API version (defaults to the latest supported version if omitted).","in":"header","name":"API-Version","required":false,"schema":{"default":"v1","enum":["v1"],"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicConsolidationRunResponse"}}},"description":"Success","headers":{"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix time (seconds) at which the rate-limit window resets.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"Scope the rate limit was applied at.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for this request; quote it in support requests.","schema":{"type":"string"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Authentication required"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Insufficient permissions"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Not found"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limit exceeded","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Internal server error"}},"security":[{"ApiKeyAuth":[]}],"summary":"Get consolidation run","tags":["Meta"]}},"/consolidation/runs/{id}/sweeps":{"get":{"description":"Returns a paginated, chronological list of the per-(address, asset) sweeps that make up a run.","operationId":"getConsolidationRunsByIdSweeps","parameters":[{"description":"Run ID","in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}},{"description":"API version (defaults to the latest supported version if omitted).","in":"header","name":"API-Version","required":false,"schema":{"default":"v1","enum":["v1"],"type":"string"}},{"description":"Opaque cursor; returns the page after this item.","in":"query","name":"starting_after","required":false,"schema":{"type":"string"}},{"description":"Opaque cursor; returns the page before this item.","in":"query","name":"ending_before","required":false,"schema":{"type":"string"}},{"description":"Page size; bounded by the endpoint maximum.","in":"query","name":"limit","required":false,"schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"example":{"data":[],"has_more":false,"next_cursor":"","object":"list","url":""},"schema":{"properties":{"data":{"items":{"$ref":"#/components/schemas/PublicConsolidationSweepResponse"},"type":"array"},"has_more":{"type":"boolean"},"next_cursor":{"description":"Opaque cursor for the next page; pass as starting_after. Present only when has_more is true.","type":"string"},"object":{"example":"list","type":"string"},"url":{"type":"string"}},"type":"object"}}},"description":"Success","headers":{"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix time (seconds) at which the rate-limit window resets.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"Scope the rate limit was applied at.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for this request; quote it in support requests.","schema":{"type":"string"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Authentication required"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Insufficient permissions"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Not found"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limit exceeded","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Internal server error"}},"security":[{"ApiKeyAuth":[]}],"summary":"List sweeps for a consolidation run","tags":["Meta"]}},"/gasstations":{"get":{"description":"Returns gas stations for the organization. Filterable by chain.","operationId":"getGasstations","parameters":[{"description":"API version (defaults to the latest supported version if omitted).","in":"header","name":"API-Version","required":false,"schema":{"default":"v1","enum":["v1"],"type":"string"}},{"description":"Opaque cursor; returns the page after this item.","in":"query","name":"starting_after","required":false,"schema":{"type":"string"}},{"description":"Opaque cursor; returns the page before this item.","in":"query","name":"ending_before","required":false,"schema":{"type":"string"}},{"description":"Page size; bounded by the endpoint maximum.","in":"query","name":"limit","required":false,"schema":{"type":"integer"}},{"description":"Filter by chain (e.g. bitcoin, ethereum, tron).","in":"query","name":"chain","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"example":{"data":[{"address":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e","asset":"ETH","asset_decimals":18,"auto_refill_enabled":true,"balance":"125000000000000000","chain":"ethereum","created_at":"2026-05-16T10:30:00Z","gas_strategy":"standard","health_status":"healthy","id":"9b2e7a1c-3d4f-4a8b-9c0d-1e2f3a4b5c6d","name":"Ethereum gas station","network":"mainnet","object":"gas_station","refill_amount":"0.25","refill_amount_raw":"250000000000000000","refill_from_wallet_id":"f47ac10b-58cc-4372-a567-0e02b2c3d479","status":"active","threshold":"0.05","threshold_raw":"50000000000000000","updated_at":"2026-05-16T10:30:00Z"}],"has_more":false,"next_cursor":"","object":"list","url":""},"schema":{"properties":{"data":{"items":{"$ref":"#/components/schemas/GasStationResponse"},"type":"array"},"has_more":{"type":"boolean"},"next_cursor":{"description":"Opaque cursor for the next page; pass as starting_after. Present only when has_more is true.","type":"string"},"object":{"example":"list","type":"string"},"url":{"type":"string"}},"type":"object"}}},"description":"Success","headers":{"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix time (seconds) at which the rate-limit window resets.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"Scope the rate limit was applied at.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for this request; quote it in support requests.","schema":{"type":"string"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Authentication required"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Insufficient permissions"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limit exceeded","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Internal server error"}},"security":[{"ApiKeyAuth":[]}],"summary":"List gas stations","tags":["Gasstations"]},"post":{"description":"Creates a new gas station for automated fee management.","operationId":"postGasstations","parameters":[{"description":"API version (defaults to the latest supported version if omitted).","in":"header","name":"API-Version","required":false,"schema":{"default":"v1","enum":["v1"],"type":"string"}},{"description":"Unique key (1-255 printable ASCII chars) used to safely retry write operations. Same key + body returns the cached response; same key + different body returns 409.","in":"header","name":"Idempotency-Key","required":false,"schema":{"maxLength":255,"minLength":1,"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateGasStationRequest"}}},"required":true},"responses":{"201":{"content":{"application/json":{"example":{"address":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e","asset":"ETH","asset_decimals":18,"auto_refill_enabled":true,"balance":"125000000000000000","chain":"ethereum","created_at":"2026-05-16T10:30:00Z","gas_strategy":"standard","health_status":"healthy","id":"9b2e7a1c-3d4f-4a8b-9c0d-1e2f3a4b5c6d","name":"Ethereum gas station","network":"mainnet","object":"gas_station","refill_amount":"0.25","refill_amount_raw":"250000000000000000","refill_from_wallet_id":"f47ac10b-58cc-4372-a567-0e02b2c3d479","status":"active","threshold":"0.05","threshold_raw":"50000000000000000","updated_at":"2026-05-16T10:30:00Z"},"schema":{"$ref":"#/components/schemas/GasStationResponse"}}},"description":"Created","headers":{"Idempotent-Replayed":{"description":"True when this response was replayed from an earlier request with the same Idempotency-Key.","schema":{"type":"boolean"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix time (seconds) at which the rate-limit window resets.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"Scope the rate limit was applied at.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for this request; quote it in support requests.","schema":{"type":"string"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Authentication required"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Insufficient permissions"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Conflict"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limit exceeded","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Internal server error"}},"security":[{"ApiKeyAuth":[]}],"summary":"Create gas station","tags":["Gasstations"]}},"/gasstations/{id}":{"get":{"description":"Returns a single gas station by ID.","operationId":"getGasstationsById","parameters":[{"description":"Gas station ID","in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}},{"description":"API version (defaults to the latest supported version if omitted).","in":"header","name":"API-Version","required":false,"schema":{"default":"v1","enum":["v1"],"type":"string"}}],"responses":{"200":{"content":{"application/json":{"example":{"address":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e","asset":"ETH","asset_decimals":18,"auto_refill_enabled":true,"balance":"125000000000000000","chain":"ethereum","created_at":"2026-05-16T10:30:00Z","gas_strategy":"standard","health_status":"healthy","id":"9b2e7a1c-3d4f-4a8b-9c0d-1e2f3a4b5c6d","name":"Ethereum gas station","network":"mainnet","object":"gas_station","refill_amount":"0.25","refill_amount_raw":"250000000000000000","refill_from_wallet_id":"f47ac10b-58cc-4372-a567-0e02b2c3d479","status":"active","threshold":"0.05","threshold_raw":"50000000000000000","updated_at":"2026-05-16T10:30:00Z"},"schema":{"$ref":"#/components/schemas/GasStationResponse"}}},"description":"Success","headers":{"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix time (seconds) at which the rate-limit window resets.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"Scope the rate limit was applied at.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for this request; quote it in support requests.","schema":{"type":"string"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Authentication required"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Insufficient permissions"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Not found"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limit exceeded","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Internal server error"}},"security":[{"ApiKeyAuth":[]}],"summary":"Get gas station","tags":["Gasstations"]},"patch":{"description":"Updates a gas station's refill configuration — threshold, auto-refill toggle, and refill amount. Omitted fields are left unchanged.","operationId":"patchGasstationsById","parameters":[{"description":"Gas station ID","in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}},{"description":"API version (defaults to the latest supported version if omitted).","in":"header","name":"API-Version","required":false,"schema":{"default":"v1","enum":["v1"],"type":"string"}},{"description":"Unique key (1-255 printable ASCII chars) used to safely retry write operations. Same key + body returns the cached response; same key + different body returns 409.","in":"header","name":"Idempotency-Key","required":false,"schema":{"maxLength":255,"minLength":1,"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateGasStationRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"example":{"address":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e","asset":"ETH","asset_decimals":18,"auto_refill_enabled":true,"balance":"125000000000000000","chain":"ethereum","created_at":"2026-05-16T10:30:00Z","gas_strategy":"standard","health_status":"healthy","id":"9b2e7a1c-3d4f-4a8b-9c0d-1e2f3a4b5c6d","name":"Ethereum gas station","network":"mainnet","object":"gas_station","refill_amount":"0.25","refill_amount_raw":"250000000000000000","refill_from_wallet_id":"f47ac10b-58cc-4372-a567-0e02b2c3d479","status":"active","threshold":"0.05","threshold_raw":"50000000000000000","updated_at":"2026-05-16T10:30:00Z"},"schema":{"$ref":"#/components/schemas/GasStationResponse"}}},"description":"Success","headers":{"Idempotent-Replayed":{"description":"True when this response was replayed from an earlier request with the same Idempotency-Key.","schema":{"type":"boolean"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix time (seconds) at which the rate-limit window resets.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"Scope the rate limit was applied at.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for this request; quote it in support requests.","schema":{"type":"string"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Authentication required"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Insufficient permissions"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Not found"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Conflict"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limit exceeded","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Internal server error"}},"security":[{"ApiKeyAuth":[]}],"summary":"Update gas station","tags":["Gasstations"]}},"/gasstations/{id}/refill":{"post":{"description":"Transfers funds to refill a gas station. Requires the Idempotency-Key header.","operationId":"postGasstationsByIdRefill","parameters":[{"description":"Gas station ID","in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}},{"description":"API version (defaults to the latest supported version if omitted).","in":"header","name":"API-Version","required":false,"schema":{"default":"v1","enum":["v1"],"type":"string"}},{"description":"Unique key (1-255 printable ASCII chars) used to safely retry write operations. Same key + body returns the cached response; same key + different body returns 409.","in":"header","name":"Idempotency-Key","required":true,"schema":{"maxLength":255,"minLength":1,"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RefillGasStationRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"example":{"amount":"25.5","amount_raw":"25500000","asset":"USDC","asset_decimals":6,"block_hash":"0x8f4c1b8e2a7d3f06c5b1a09e8d7c6f5e4d3c2b1a09f8e7d6c5b4a3928170615f","block_number":21345678,"broadcast_at":"2026-05-16T10:30:02Z","chain":"ethereum","completed_at":"2026-05-16T10:30:45Z","confirmations":12,"created_at":"2026-05-16T10:30:00Z","direction":"outbound","execute_at":"2026-05-16T11:30:00Z","fee_amount":"0.0012","fee_amount_raw":"1200000000000000","fee_asset":"ETH","fee_decimals":18,"from_address":"0x3f5CE5FBFe3E9af3971dD833D26bA9b5C936f0bE","gas_station_id":"9b2e7a1c-3d4f-4a8b-9c0d-1e2f3a4b5c6d","id":"7c9e6679-7425-40de-944b-e07fc1f90ae7","network":"mainnet","note":"Invoice 4471 payout","object":"transaction","realized_fee_amount":"0.001","realized_fee_amount_raw":"1000000000000000","realized_fee_asset":"ETH","realized_fee_decimals":18,"signed_at":"2026-05-16T10:30:01Z","sponsored":false,"status":"completed","to_address":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e","tx_hash":"0x9f4c1b8e2a7d3f06c5b1a09e8d7c6f5e4d3c2b1a09f8e7d6c5b4a3928170615f","wallet_id":"a1b2c3d4-5e6f-7a8b-9c0d-1e2f3a4b5c6d"},"schema":{"$ref":"#/components/schemas/TransactionResponse"}}},"description":"Success","headers":{"Idempotent-Replayed":{"description":"True when this response was replayed from an earlier request with the same Idempotency-Key.","schema":{"type":"boolean"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix time (seconds) at which the rate-limit window resets.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"Scope the rate limit was applied at.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for this request; quote it in support requests.","schema":{"type":"string"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Authentication required"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Insufficient permissions"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Not found"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Conflict"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limit exceeded","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Internal server error"}},"security":[{"ApiKeyAuth":[]}],"summary":"Refill gas station","tags":["Gasstations"]}},"/gasstations/{id}/sponsor-broadcast":{"post":{"description":"Sponsors and/or broadcasts an externally signed Tron transaction using the selected gas station. Requires the Idempotency-Key header.","operationId":"postGasstationsByIdSponsor-broadcast","parameters":[{"description":"Gas station ID","in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}},{"description":"API version (defaults to the latest supported version if omitted).","in":"header","name":"API-Version","required":false,"schema":{"default":"v1","enum":["v1"],"type":"string"}},{"description":"Unique key (1-255 printable ASCII chars) used to safely retry write operations. Same key + body returns the cached response; same key + different body returns 409.","in":"header","name":"Idempotency-Key","required":true,"schema":{"maxLength":255,"minLength":1,"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SponsorBroadcastRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"example":{"broadcast_accepted":true,"gas_station_id":"9b2e7a1c-3d4f-4a8b-9c0d-1e2f3a4b5c6d","object":"sponsor_broadcast","status":"broadcasting","tx_hash":"e1f2c3..."},"schema":{"$ref":"#/components/schemas/SponsorBroadcastResponse"}}},"description":"Success","headers":{"Idempotent-Replayed":{"description":"True when this response was replayed from an earlier request with the same Idempotency-Key.","schema":{"type":"boolean"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix time (seconds) at which the rate-limit window resets.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"Scope the rate limit was applied at.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for this request; quote it in support requests.","schema":{"type":"string"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Authentication required"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Insufficient permissions"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Not found"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Conflict"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limit exceeded","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Internal server error"}},"security":[{"ApiKeyAuth":[]}],"summary":"Sponsor and broadcast external Tron transaction","tags":["Gasstations"]}},"/insights/estimate-network-fees":{"get":{"description":"Returns current network/gas fees at low, medium, and high priority. With no filter it returns every supported chain (native fee); pass asset_id for a specific asset, or chain for a single chain. For bitcoin, fee_per_byte (sat/vB) is exact and network_fee is a representative total for a typical send.","operationId":"getInsightsEstimate-network-fees","parameters":[{"description":"API version (defaults to the latest supported version if omitted).","in":"header","name":"API-Version","required":false,"schema":{"default":"v1","enum":["v1"],"type":"string"}},{"description":"Estimate for a single asset (id from the /assets endpoint, e.g. USDC_ETH).","in":"query","name":"asset_id","required":false,"schema":{"type":"string"}},{"description":"Estimate the native fee for a single chain (e.g. ethereum).","in":"query","name":"chain","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"example":{"data":[],"has_more":false,"next_cursor":"","object":"list","url":""},"schema":{"properties":{"data":{"items":{"$ref":"#/components/schemas/NetworkFeeResponse"},"type":"array"},"has_more":{"type":"boolean"},"next_cursor":{"description":"Opaque cursor for the next page; pass as starting_after. Present only when has_more is true.","type":"string"},"object":{"example":"list","type":"string"},"url":{"type":"string"}},"type":"object"}}},"description":"Success","headers":{"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix time (seconds) at which the rate-limit window resets.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"Scope the rate limit was applied at.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for this request; quote it in support requests.","schema":{"type":"string"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Authentication required"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Insufficient permissions"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limit exceeded","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Internal server error"}},"security":[{"ApiKeyAuth":[]}],"summary":"Estimate network fees","tags":["Insights/estimate-network-fees"]}},"/me":{"get":{"description":"Returns metadata about the authenticated API key including organization and scopes.","operationId":"getMe","parameters":[{"description":"API version (defaults to the latest supported version if omitted).","in":"header","name":"API-Version","required":false,"schema":{"default":"v1","enum":["v1"],"type":"string"}}],"responses":{"200":{"content":{"application/json":{"example":{"api_version":"v1","created_at":"2026-05-16T10:30:00Z","id":"7c9e6679-7425-40de-944b-e07fc1f90ae7","last_used_at":"2026-05-16T10:30:00Z","name":"Production server key","object":"api_key","organization_id":"a1b2c3d4-5e6f-7a8b-9c0d-1e2f3a4b5c6d"},"schema":{"$ref":"#/components/schemas/APIKeyInfoResponse"}}},"description":"Success","headers":{"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix time (seconds) at which the rate-limit window resets.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"Scope the rate limit was applied at.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for this request; quote it in support requests.","schema":{"type":"string"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Authentication required"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Insufficient permissions"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limit exceeded","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Internal server error"}},"security":[{"ApiKeyAuth":[]}],"summary":"Get API key info","tags":["Meta"]}},"/policies":{"get":{"description":"Returns a paginated list of policies for the organization. Quorum policies are excluded and available via GET /v1/policies/quorum. Supports cursor-based pagination and filters for status and name search.\n\n**Pagination**: Uses opaque cursor pagination. The cursor is base64-encoded and opaque — do not construct or inspect it. On the first request omit `cursor` / `starting_after`. When `has_more` is true, pass the `next_cursor` value from the response as `starting_after` on the next request. Continue until `has_more` is false.\n\n**`limit`**: Page size (default 20, max 100). Capped at the server maximum silently.\n\n**`has_more`**: True when more results exist after this page; call again with the cursor from the response.","operationId":"getPolicies","parameters":[{"description":"API version (defaults to the latest supported version if omitted).","in":"header","name":"API-Version","required":false,"schema":{"default":"v1","enum":["v1"],"type":"string"}},{"description":"Opaque cursor; returns the page after this item.","in":"query","name":"starting_after","required":false,"schema":{"type":"string"}},{"description":"Opaque cursor; returns the page before this item.","in":"query","name":"ending_before","required":false,"schema":{"type":"string"}},{"description":"Page size; bounded by the endpoint maximum.","in":"query","name":"limit","required":false,"schema":{"type":"integer"}},{"description":"Filter by policy status (active, inactive).","in":"query","name":"status","required":false,"schema":{"type":"string"}},{"description":"Search policies by name (case-insensitive prefix/contains match).","in":"query","name":"search","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"example":{"data":[{"category":"approvals","created_at":"2026-05-16T10:30:00Z","created_by":"3f1a2b3c-4d5e-6f7a-8b9c-0d1e2f3a4b5c","created_by_name":"Ebot Ndip","description":"Require approval for transfers above $10k","id":"a1b2c3d4-5e6f-7a8b-9c0d-1e2f3a4b5c6d","is_active":false,"is_template":false,"name":"High-value transfer review","object":"policy","priority":100,"rule_count":2,"rules":[{"action_type":"require_approval","conditions":[{"field":"amount_usd","max":"500","min":"100","operator":"greater_than","value":"10000","values":"[\"BTC\",\"ETH\"]"}],"created_at":"2026-05-16T10:30:00Z","id":"7c9e6679-7425-40de-944b-e07fc1f90ae7","name":"Block large transfers","object":"rule","order":1,"priority":50,"updated_at":"2026-05-16T10:30:00Z"}],"status":"draft","template_id":"f47ac10b-58cc-4372-a567-0e02b2c3d479","updated_at":"2026-05-16T10:30:00Z"}],"has_more":false,"next_cursor":"","object":"list","url":""},"schema":{"properties":{"data":{"items":{"$ref":"#/components/schemas/PublicPolicyResponse"},"type":"array"},"has_more":{"type":"boolean"},"next_cursor":{"description":"Opaque cursor for the next page; pass as starting_after. Present only when has_more is true.","type":"string"},"object":{"example":"list","type":"string"},"url":{"type":"string"}},"type":"object"}}},"description":"Success","headers":{"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix time (seconds) at which the rate-limit window resets.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"Scope the rate limit was applied at.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for this request; quote it in support requests.","schema":{"type":"string"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Authentication required"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Insufficient permissions"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limit exceeded","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Internal server error"}},"security":[{"ApiKeyAuth":[]}],"summary":"List policies","tags":["Policies"]},"post":{"description":"Creates a new policy in `draft` status. Drafts are not enforced — they can be edited freely before activation. To activate, see POST /v1/policies/{id}/activate (coming in a future release). The `Idempotency-Key` header is required. Omitting `category` defaults to \"access\".","operationId":"postPolicies","parameters":[{"description":"API version (defaults to the latest supported version if omitted).","in":"header","name":"API-Version","required":false,"schema":{"default":"v1","enum":["v1"],"type":"string"}},{"description":"Unique key (1-255 printable ASCII chars) used to safely retry write operations. Same key + body returns the cached response; same key + different body returns 409.","in":"header","name":"Idempotency-Key","required":true,"schema":{"maxLength":255,"minLength":1,"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicCreatePolicyRequest"}}},"required":true},"responses":{"201":{"content":{"application/json":{"example":{"category":"approvals","created_at":"2026-05-16T10:30:00Z","created_by":"3f1a2b3c-4d5e-6f7a-8b9c-0d1e2f3a4b5c","created_by_name":"Ebot Ndip","description":"Require approval for transfers above $10k","id":"a1b2c3d4-5e6f-7a8b-9c0d-1e2f3a4b5c6d","is_active":false,"is_template":false,"name":"High-value transfer review","object":"policy","priority":100,"rule_count":2,"rules":[{"action_type":"require_approval","conditions":[{"field":"amount_usd","max":"500","min":"100","operator":"greater_than","value":"10000","values":"[\"BTC\",\"ETH\"]"}],"created_at":"2026-05-16T10:30:00Z","id":"7c9e6679-7425-40de-944b-e07fc1f90ae7","name":"Block large transfers","object":"rule","order":1,"priority":50,"updated_at":"2026-05-16T10:30:00Z"}],"status":"draft","template_id":"f47ac10b-58cc-4372-a567-0e02b2c3d479","updated_at":"2026-05-16T10:30:00Z"},"schema":{"$ref":"#/components/schemas/PublicPolicyResponse"}}},"description":"Created","headers":{"Idempotent-Replayed":{"description":"True when this response was replayed from an earlier request with the same Idempotency-Key.","schema":{"type":"boolean"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix time (seconds) at which the rate-limit window resets.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"Scope the rate limit was applied at.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for this request; quote it in support requests.","schema":{"type":"string"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Authentication required"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Insufficient permissions"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Conflict"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limit exceeded","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Internal server error"}},"security":[{"ApiKeyAuth":[]}],"summary":"Create draft policy","tags":["Policies"]}},"/policies/evaluate":{"post":{"description":"Runs the policy engine against a synthetic transaction request and returns the decision without any side effects. No approval requests are created, no audit log entries are written, and no transactions are inserted.\n\nUse this endpoint to preview how the active policy would respond to a given request before committing to it — for example, when configuring automation rules or testing policy changes.\n\nAll request fields are optional. Omitting a field means 'not applicable' for that condition axis. When no active policy exists the verdict is 'no_match' with Allowed=true.\n\nThe response includes a `trace` field containing a per-rule evaluation trace when the evaluator supports it. Each entry records whether the rule matched and, if not, which condition failed first.","operationId":"postPoliciesEvaluate","parameters":[{"description":"API version (defaults to the latest supported version if omitted).","in":"header","name":"API-Version","required":false,"schema":{"default":"v1","enum":["v1"],"type":"string"}},{"description":"Unique key (1-255 printable ASCII chars) used to safely retry write operations. Same key + body returns the cached response; same key + different body returns 409.","in":"header","name":"Idempotency-Key","required":false,"schema":{"maxLength":255,"minLength":1,"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicEvaluateRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"example":{"allowed":false,"result":"matched_rule","trace":[{"failed_condition":{"actual":"500","expected":"10000","field":"amount_usd","operator":"greater_than"},"rule_index":0}]},"schema":{"$ref":"#/components/schemas/PublicEvaluateResponse"}}},"description":"Success","headers":{"Idempotent-Replayed":{"description":"True when this response was replayed from an earlier request with the same Idempotency-Key.","schema":{"type":"boolean"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix time (seconds) at which the rate-limit window resets.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"Scope the rate limit was applied at.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for this request; quote it in support requests.","schema":{"type":"string"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Authentication required"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Insufficient permissions"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Conflict"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limit exceeded","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Internal server error"}},"security":[{"ApiKeyAuth":[]}],"summary":"Dry-run policy evaluation","tags":["Policies"]}},"/policies/quorum":{"get":{"description":"Returns the organization's quorum catch-all policy, which governs admin operations requiring multi-party approval. Returns 404 when no quorum policy has been configured.","operationId":"getPoliciesQuorum","parameters":[{"description":"API version (defaults to the latest supported version if omitted).","in":"header","name":"API-Version","required":false,"schema":{"default":"v1","enum":["v1"],"type":"string"}}],"responses":{"200":{"content":{"application/json":{"example":{"category":"approvals","created_at":"2026-05-16T10:30:00Z","created_by":"3f1a2b3c-4d5e-6f7a-8b9c-0d1e2f3a4b5c","created_by_name":"Ebot Ndip","description":"Require approval for transfers above $10k","id":"a1b2c3d4-5e6f-7a8b-9c0d-1e2f3a4b5c6d","is_active":false,"is_template":false,"name":"High-value transfer review","object":"policy","priority":100,"rule_count":2,"rules":[{"action_type":"require_approval","conditions":[{"field":"amount_usd","max":"500","min":"100","operator":"greater_than","value":"10000","values":"[\"BTC\",\"ETH\"]"}],"created_at":"2026-05-16T10:30:00Z","id":"7c9e6679-7425-40de-944b-e07fc1f90ae7","name":"Block large transfers","object":"rule","order":1,"priority":50,"updated_at":"2026-05-16T10:30:00Z"}],"status":"draft","template_id":"f47ac10b-58cc-4372-a567-0e02b2c3d479","updated_at":"2026-05-16T10:30:00Z"},"schema":{"$ref":"#/components/schemas/PublicPolicyResponse"}}},"description":"Success","headers":{"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix time (seconds) at which the rate-limit window resets.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"Scope the rate limit was applied at.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for this request; quote it in support requests.","schema":{"type":"string"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Authentication required"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Insufficient permissions"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limit exceeded","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Internal server error"}},"security":[{"ApiKeyAuth":[]}],"summary":"Get quorum policy","tags":["Policies"]}},"/policies/schema":{"get":{"description":"Returns the canonical lists of valid policy categories, action types, condition fields (with value-type hints and supported operators), and operators (with arity and value shape). Use this endpoint to discover valid values before constructing rules — no trial-and-error required.\n\nThe `operators` list documents how to format condition values:\n- `scalar` (arity) / `single` (value_shape): pass one value, e.g. `\"0.5\"`\n- `range` (arity) / `min,max` (value_shape): pass two comma-separated values, e.g. `\"100,500\"`\n- `set` (arity) / `comma-separated` (value_shape): pass one or more values, e.g. `\"ethereum,bitcoin\"`","operationId":"getPoliciesSchema","parameters":[{"description":"API version (defaults to the latest supported version if omitted).","in":"header","name":"API-Version","required":false,"schema":{"default":"v1","enum":["v1"],"type":"string"}}],"responses":{"200":{"content":{"application/json":{"example":{"object":"policy_schema"},"schema":{"$ref":"#/components/schemas/PolicySchemaResponse"}}},"description":"Success","headers":{"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix time (seconds) at which the rate-limit window resets.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"Scope the rate limit was applied at.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for this request; quote it in support requests.","schema":{"type":"string"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Authentication required"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Insufficient permissions"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limit exceeded","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Internal server error"}},"security":[{"ApiKeyAuth":[]}],"summary":"Get policy schema","tags":["Policies"]}},"/policies/validate":{"post":{"description":"Validate a proposed rule array without persisting. Use this to lint a policy before submitting POST /v1/policies. Side-effect-free.","operationId":"postPoliciesValidate","parameters":[{"description":"API version (defaults to the latest supported version if omitted).","in":"header","name":"API-Version","required":false,"schema":{"default":"v1","enum":["v1"],"type":"string"}},{"description":"Unique key (1-255 printable ASCII chars) used to safely retry write operations. Same key + body returns the cached response; same key + different body returns 409.","in":"header","name":"Idempotency-Key","required":false,"schema":{"maxLength":255,"minLength":1,"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicValidateDraftRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"example":{"diagnostics":[{"code":"unreachable_rule","rule_index":0,"severity":"warning"}],"issue_count":{"error":0,"info":0,"warning":1},"valid":true},"schema":{"$ref":"#/components/schemas/PublicValidationResult"}}},"description":"Success","headers":{"Idempotent-Replayed":{"description":"True when this response was replayed from an earlier request with the same Idempotency-Key.","schema":{"type":"boolean"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix time (seconds) at which the rate-limit window resets.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"Scope the rate limit was applied at.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for this request; quote it in support requests.","schema":{"type":"string"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Authentication required"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Insufficient permissions"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Conflict"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limit exceeded","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Internal server error"}},"security":[{"ApiKeyAuth":[]}],"summary":"Validate in-flight rule array","tags":["Policies"]}},"/policies/{id}":{"delete":{"description":"Soft-deletes a draft policy. Active policies cannot be deleted — deactivate first or submit a new draft.","operationId":"deletePoliciesById","parameters":[{"description":"Policy ID","in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}},{"description":"API version (defaults to the latest supported version if omitted).","in":"header","name":"API-Version","required":false,"schema":{"default":"v1","enum":["v1"],"type":"string"}},{"description":"Unique key (1-255 printable ASCII chars) used to safely retry write operations. Same key + body returns the cached response; same key + different body returns 409.","in":"header","name":"Idempotency-Key","required":false,"schema":{"maxLength":255,"minLength":1,"type":"string"}}],"responses":{"200":{"description":"Success","headers":{"Idempotent-Replayed":{"description":"True when this response was replayed from an earlier request with the same Idempotency-Key.","schema":{"type":"boolean"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix time (seconds) at which the rate-limit window resets.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"Scope the rate limit was applied at.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for this request; quote it in support requests.","schema":{"type":"string"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Authentication required"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Insufficient permissions"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Not found"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Conflict"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limit exceeded","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Internal server error"}},"security":[{"ApiKeyAuth":[]}],"summary":"Delete draft policy","tags":["Policies"]},"get":{"description":"Returns a single policy by ID, including its rules.","operationId":"getPoliciesById","parameters":[{"description":"Policy ID","in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}},{"description":"API version (defaults to the latest supported version if omitted).","in":"header","name":"API-Version","required":false,"schema":{"default":"v1","enum":["v1"],"type":"string"}}],"responses":{"200":{"content":{"application/json":{"example":{"category":"approvals","created_at":"2026-05-16T10:30:00Z","created_by":"3f1a2b3c-4d5e-6f7a-8b9c-0d1e2f3a4b5c","created_by_name":"Ebot Ndip","description":"Require approval for transfers above $10k","id":"a1b2c3d4-5e6f-7a8b-9c0d-1e2f3a4b5c6d","is_active":false,"is_template":false,"name":"High-value transfer review","object":"policy","priority":100,"rule_count":2,"rules":[{"action_type":"require_approval","conditions":[{"field":"amount_usd","max":"500","min":"100","operator":"greater_than","value":"10000","values":"[\"BTC\",\"ETH\"]"}],"created_at":"2026-05-16T10:30:00Z","id":"7c9e6679-7425-40de-944b-e07fc1f90ae7","name":"Block large transfers","object":"rule","order":1,"priority":50,"updated_at":"2026-05-16T10:30:00Z"}],"status":"draft","template_id":"f47ac10b-58cc-4372-a567-0e02b2c3d479","updated_at":"2026-05-16T10:30:00Z"},"schema":{"$ref":"#/components/schemas/PublicPolicyResponse"}}},"description":"Success","headers":{"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix time (seconds) at which the rate-limit window resets.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"Scope the rate limit was applied at.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for this request; quote it in support requests.","schema":{"type":"string"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Authentication required"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Insufficient permissions"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Not found"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limit exceeded","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Internal server error"}},"security":[{"ApiKeyAuth":[]}],"summary":"Get policy","tags":["Policies"]},"put":{"description":"Updates metadata on a draft policy. Rule changes go through the dedicated rule endpoints. Drafts only — active policies cannot be updated directly. Submit changes as a new draft and activate it instead.","operationId":"putPoliciesById","parameters":[{"description":"Policy ID","in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}},{"description":"API version (defaults to the latest supported version if omitted).","in":"header","name":"API-Version","required":false,"schema":{"default":"v1","enum":["v1"],"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicUpdatePolicyRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"example":{"category":"approvals","created_at":"2026-05-16T10:30:00Z","created_by":"3f1a2b3c-4d5e-6f7a-8b9c-0d1e2f3a4b5c","created_by_name":"Ebot Ndip","description":"Require approval for transfers above $10k","id":"a1b2c3d4-5e6f-7a8b-9c0d-1e2f3a4b5c6d","is_active":false,"is_template":false,"name":"High-value transfer review","object":"policy","priority":100,"rule_count":2,"rules":[{"action_type":"require_approval","conditions":[{"field":"amount_usd","max":"500","min":"100","operator":"greater_than","value":"10000","values":"[\"BTC\",\"ETH\"]"}],"created_at":"2026-05-16T10:30:00Z","id":"7c9e6679-7425-40de-944b-e07fc1f90ae7","name":"Block large transfers","object":"rule","order":1,"priority":50,"updated_at":"2026-05-16T10:30:00Z"}],"status":"draft","template_id":"f47ac10b-58cc-4372-a567-0e02b2c3d479","updated_at":"2026-05-16T10:30:00Z"},"schema":{"$ref":"#/components/schemas/PublicPolicyResponse"}}},"description":"Success","headers":{"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix time (seconds) at which the rate-limit window resets.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"Scope the rate limit was applied at.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for this request; quote it in support requests.","schema":{"type":"string"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Authentication required"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Insufficient permissions"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Not found"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limit exceeded","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Internal server error"}},"security":[{"ApiKeyAuth":[]}],"summary":"Update draft policy","tags":["Policies"]}},"/policies/{id}/activate":{"post":{"description":"Stages a draft policy for activation as the organization's single enforced policy. API-initiated activation ALWAYS routes through quorum — the request is never applied immediately.\n\nResponse shapes:\n- **202 Accepted**: activation staged, awaiting quorum approval from ≥2 approvers.\n- **409 Conflict**: policy is already active.\n- **422 Unprocessable Entity**: either the org's quorum is not configured with ≥2 approvers (configure it via the UI first), or a direct-activation path was attempted (which violates the two-principal invariant and is never permitted via API key).\n\nThe two-principal invariant: no single API key may unilaterally activate a policy. Configure your org's quorum policy with at least 2 approvers to use this endpoint.\n\nTracking the outcome: there is no public approval-status endpoint. Poll `GET /v1/policies/{id}` until its `status` becomes `enforced` (approved) — it stays `draft` if the approval request expires or is rejected — or subscribe to a webhook. The returned `approval_request_id` is for correlation (dashboard/webhooks), not a pollable API resource.","operationId":"postPoliciesByIdActivate","parameters":[{"description":"Policy ID","in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}},{"description":"API version (defaults to the latest supported version if omitted).","in":"header","name":"API-Version","required":false,"schema":{"default":"v1","enum":["v1"],"type":"string"}},{"description":"Unique key (1-255 printable ASCII chars) used to safely retry write operations. Same key + body returns the cached response; same key + different body returns 409.","in":"header","name":"Idempotency-Key","required":false,"schema":{"maxLength":255,"minLength":1,"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicActivatePolicyRequest"}}},"required":true},"responses":{"202":{"content":{"application/json":{"example":{"approval_request_id":"9b2e7a1c-3d4f-4a8b-9c0d-1e2f3a4b5c6d","expires_at":"2026-05-17T10:30:00Z","policy_id":"f47ac10b-58cc-4372-a567-0e02b2c3d479","required_approvals":2,"status":"pending_authorization"},"schema":{"$ref":"#/components/schemas/PublicPendingActivationResponse"}}},"description":"Success","headers":{"Idempotent-Replayed":{"description":"True when this response was replayed from an earlier request with the same Idempotency-Key.","schema":{"type":"boolean"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix time (seconds) at which the rate-limit window resets.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"Scope the rate limit was applied at.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for this request; quote it in support requests.","schema":{"type":"string"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Authentication required"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Insufficient permissions"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Not found"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Quorum not configured with ≥2 approvers, or a direct-activation path was attempted (violates the two-principal invariant)."},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limit exceeded","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Internal server error"}},"security":[{"ApiKeyAuth":[]}],"summary":"Activate policy","tags":["Policies"]}},"/policies/{id}/audit":{"get":{"description":"Returns a paginated list of audit log entries for a policy, ordered by most recent first.\n\n**Pagination**: Uses opaque cursor pagination. Omit `starting_after` on the first request. When `has_more` is true, pass the `next_cursor` value from the response as `starting_after` on the next call. `has_more` is false when the last page has been reached.\n\n**`cursor`** (alias `starting_after`): Opaque cursor from a prior response's `next_cursor` field. Omit on first page.\n\n**`limit`**: Page size (default 20, max 100).","operationId":"getPoliciesByIdAudit","parameters":[{"description":"Policy ID","in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}},{"description":"API version (defaults to the latest supported version if omitted).","in":"header","name":"API-Version","required":false,"schema":{"default":"v1","enum":["v1"],"type":"string"}},{"description":"Opaque cursor; returns the page after this item.","in":"query","name":"starting_after","required":false,"schema":{"type":"string"}},{"description":"Opaque cursor; returns the page before this item.","in":"query","name":"ending_before","required":false,"schema":{"type":"string"}},{"description":"Page size; bounded by the endpoint maximum.","in":"query","name":"limit","required":false,"schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"example":{"data":[{"action":"created","actor_id":"3f1a2b3c-4d5e-6f7a-8b9c-0d1e2f3a4b5c","actor_name":"Ebot Ndip","created_at":"2026-05-16T10:30:00Z","id":"9b2e7a1c-3d4f-4a8b-9c0d-1e2f3a4b5c6d","object":"policy_audit_log","policy_id":"a1b2c3d4-5e6f-7a8b-9c0d-1e2f3a4b5c6d"}],"has_more":false,"next_cursor":"","object":"list","url":""},"schema":{"properties":{"data":{"items":{"$ref":"#/components/schemas/PublicAuditLogResponse"},"type":"array"},"has_more":{"type":"boolean"},"next_cursor":{"description":"Opaque cursor for the next page; pass as starting_after. Present only when has_more is true.","type":"string"},"object":{"example":"list","type":"string"},"url":{"type":"string"}},"type":"object"}}},"description":"Success","headers":{"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix time (seconds) at which the rate-limit window resets.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"Scope the rate limit was applied at.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for this request; quote it in support requests.","schema":{"type":"string"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Authentication required"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Insufficient permissions"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Not found"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limit exceeded","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Internal server error"}},"security":[{"ApiKeyAuth":[]}],"summary":"Get policy audit log","tags":["Policies"]}},"/policies/{id}/rules":{"post":{"description":"Adds a new rule to a draft policy. Rules can only be added/modified/removed on drafts. To change the active policy, submit a new draft and activate it. The `Idempotency-Key` header is required.","operationId":"postPoliciesByIdRules","parameters":[{"description":"Policy ID","in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}},{"description":"API version (defaults to the latest supported version if omitted).","in":"header","name":"API-Version","required":false,"schema":{"default":"v1","enum":["v1"],"type":"string"}},{"description":"Unique key (1-255 printable ASCII chars) used to safely retry write operations. Same key + body returns the cached response; same key + different body returns 409.","in":"header","name":"Idempotency-Key","required":true,"schema":{"maxLength":255,"minLength":1,"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicCreateRuleRequest"}}},"required":true},"responses":{"201":{"content":{"application/json":{"example":{"action_type":"require_approval","conditions":[{"field":"amount_usd","max":"500","min":"100","operator":"greater_than","value":"10000","values":"[\"BTC\",\"ETH\"]"}],"created_at":"2026-05-16T10:30:00Z","id":"7c9e6679-7425-40de-944b-e07fc1f90ae7","name":"Block large transfers","object":"rule","order":1,"priority":50,"updated_at":"2026-05-16T10:30:00Z"},"schema":{"$ref":"#/components/schemas/PublicRuleResponse"}}},"description":"Created","headers":{"Idempotent-Replayed":{"description":"True when this response was replayed from an earlier request with the same Idempotency-Key.","schema":{"type":"boolean"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix time (seconds) at which the rate-limit window resets.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"Scope the rate limit was applied at.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for this request; quote it in support requests.","schema":{"type":"string"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Authentication required"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Insufficient permissions"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Not found"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Conflict"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limit exceeded","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Internal server error"}},"security":[{"ApiKeyAuth":[]}],"summary":"Add rule to draft policy","tags":["Policies"]}},"/policies/{id}/rules/{ruleId}":{"delete":{"description":"Soft-deletes a rule from a draft policy. Rules can only be added/modified/removed on drafts. To change the active policy, submit a new draft and activate it.","operationId":"deletePoliciesByIdRulesByRuleId","parameters":[{"description":"Policy ID","in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}},{"description":"Rule ID","in":"path","name":"ruleId","required":true,"schema":{"type":"string"}},{"description":"API version (defaults to the latest supported version if omitted).","in":"header","name":"API-Version","required":false,"schema":{"default":"v1","enum":["v1"],"type":"string"}},{"description":"Unique key (1-255 printable ASCII chars) used to safely retry write operations. Same key + body returns the cached response; same key + different body returns 409.","in":"header","name":"Idempotency-Key","required":false,"schema":{"maxLength":255,"minLength":1,"type":"string"}}],"responses":{"200":{"description":"Success","headers":{"Idempotent-Replayed":{"description":"True when this response was replayed from an earlier request with the same Idempotency-Key.","schema":{"type":"boolean"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix time (seconds) at which the rate-limit window resets.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"Scope the rate limit was applied at.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for this request; quote it in support requests.","schema":{"type":"string"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Authentication required"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Insufficient permissions"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Not found"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Conflict"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limit exceeded","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Internal server error"}},"security":[{"ApiKeyAuth":[]}],"summary":"Remove rule from draft policy","tags":["Policies"]},"put":{"description":"Updates an existing rule on a draft policy. All fields are optional. Rules can only be added/modified/removed on drafts. To change the active policy, submit a new draft and activate it.","operationId":"putPoliciesByIdRulesByRuleId","parameters":[{"description":"Policy ID","in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}},{"description":"Rule ID","in":"path","name":"ruleId","required":true,"schema":{"type":"string"}},{"description":"API version (defaults to the latest supported version if omitted).","in":"header","name":"API-Version","required":false,"schema":{"default":"v1","enum":["v1"],"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicUpdateRuleRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"example":{"action_type":"require_approval","conditions":[{"field":"amount_usd","max":"500","min":"100","operator":"greater_than","value":"10000","values":"[\"BTC\",\"ETH\"]"}],"created_at":"2026-05-16T10:30:00Z","id":"7c9e6679-7425-40de-944b-e07fc1f90ae7","name":"Block large transfers","object":"rule","order":1,"priority":50,"updated_at":"2026-05-16T10:30:00Z"},"schema":{"$ref":"#/components/schemas/PublicRuleResponse"}}},"description":"Success","headers":{"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix time (seconds) at which the rate-limit window resets.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"Scope the rate limit was applied at.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for this request; quote it in support requests.","schema":{"type":"string"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Authentication required"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Insufficient permissions"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Not found"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limit exceeded","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Internal server error"}},"security":[{"ApiKeyAuth":[]}],"summary":"Update rule on draft policy","tags":["Policies"]}},"/policies/{id}/validate":{"post":{"description":"Validate a stored draft policy. Returns Tier 1 (lexical/syntactic) and Tier 2 (subsumption/shadowing) diagnostics. The operation is side-effect-free — no DB writes are performed. Works on both draft and active policies; validation is always read-only.","operationId":"postPoliciesByIdValidate","parameters":[{"description":"Policy ID","in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}},{"description":"API version (defaults to the latest supported version if omitted).","in":"header","name":"API-Version","required":false,"schema":{"default":"v1","enum":["v1"],"type":"string"}},{"description":"Unique key (1-255 printable ASCII chars) used to safely retry write operations. Same key + body returns the cached response; same key + different body returns 409.","in":"header","name":"Idempotency-Key","required":false,"schema":{"maxLength":255,"minLength":1,"type":"string"}}],"responses":{"200":{"content":{"application/json":{"example":{"diagnostics":[{"code":"unreachable_rule","rule_index":0,"severity":"warning"}],"issue_count":{"error":0,"info":0,"warning":1},"valid":true},"schema":{"$ref":"#/components/schemas/PublicValidationResult"}}},"description":"Success","headers":{"Idempotent-Replayed":{"description":"True when this response was replayed from an earlier request with the same Idempotency-Key.","schema":{"type":"boolean"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix time (seconds) at which the rate-limit window resets.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"Scope the rate limit was applied at.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for this request; quote it in support requests.","schema":{"type":"string"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Authentication required"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Insufficient permissions"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Not found"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Conflict"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limit exceeded","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Internal server error"}},"security":[{"ApiKeyAuth":[]}],"summary":"Validate stored draft policy","tags":["Policies"]}},"/rpc/{chain_network}":{"post":{"description":"Proxies a JSON-RPC 2.0 call to the specified blockchain node. Use a chain-network path like eth-mainnet or bsc-mainnet. The request body and response body are passed through verbatim.","operationId":"postRpcByChain_network","parameters":[{"description":"Target chain and network, e.g. ethereum-mainnet or bitcoin-testnet","in":"path","name":"chain_network","required":true,"schema":{"type":"string"}},{"description":"API version (defaults to the latest supported version if omitted).","in":"header","name":"API-Version","required":false,"schema":{"default":"v1","enum":["v1"],"type":"string"}},{"description":"Unique key (1-255 printable ASCII chars) used to safely retry write operations. Same key + body returns the cached response; same key + different body returns 409.","in":"header","name":"Idempotency-Key","required":false,"schema":{"maxLength":255,"minLength":1,"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JSONRPCRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"example":{"id":"1","jsonrpc":"2.0"},"schema":{"$ref":"#/components/schemas/JSONRPCResponse"}}},"description":"Success","headers":{"Idempotent-Replayed":{"description":"True when this response was replayed from an earlier request with the same Idempotency-Key.","schema":{"type":"boolean"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix time (seconds) at which the rate-limit window resets.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"Scope the rate limit was applied at.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for this request; quote it in support requests.","schema":{"type":"string"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Authentication required"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Insufficient permissions"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Not found"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Conflict"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limit exceeded","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Internal server error"}},"security":[{"ApiKeyAuth":[]}],"summary":"Execute RPC call","tags":["Rpc"]}},"/subscriptions":{"get":{"description":"Returns a paginated list of subscriptions for the organization. Filterable by chain, network, status.","operationId":"getSubscriptions","parameters":[{"description":"API version (defaults to the latest supported version if omitted).","in":"header","name":"API-Version","required":false,"schema":{"default":"v1","enum":["v1"],"type":"string"}},{"description":"Opaque cursor; returns the page after this item.","in":"query","name":"starting_after","required":false,"schema":{"type":"string"}},{"description":"Opaque cursor; returns the page before this item.","in":"query","name":"ending_before","required":false,"schema":{"type":"string"}},{"description":"Page size; bounded by the endpoint maximum.","in":"query","name":"limit","required":false,"schema":{"type":"integer"}},{"description":"Filter by chain.","in":"query","name":"chain","required":false,"schema":{"type":"string"}},{"description":"Filter by network (e.g. mainnet, testnet).","in":"query","name":"network","required":false,"schema":{"type":"string"}},{"description":"Filter by subscription status.","in":"query","name":"status","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"example":{"data":[{"address":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e","chain":"ethereum","created_at":"2026-05-16T10:30:00Z","event_type":"incoming_token_tx","has_signing_secret":true,"id":"7c9e6679-7425-40de-944b-e07fc1f90ae7","label":"Customer deposit monitor","last_event_at":"2026-05-16T10:30:00Z","network":"mainnet","object":"subscription","status":"active","updated_at":"2026-05-16T10:30:00Z","webhook_url":"https://example.com/webhooks/bitnob"}],"has_more":false,"next_cursor":"","object":"list","url":""},"schema":{"properties":{"data":{"items":{"$ref":"#/components/schemas/SubscriptionResponse"},"type":"array"},"has_more":{"type":"boolean"},"next_cursor":{"description":"Opaque cursor for the next page; pass as starting_after. Present only when has_more is true.","type":"string"},"object":{"example":"list","type":"string"},"url":{"type":"string"}},"type":"object"}}},"description":"Success","headers":{"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix time (seconds) at which the rate-limit window resets.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"Scope the rate limit was applied at.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for this request; quote it in support requests.","schema":{"type":"string"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Authentication required"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Insufficient permissions"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limit exceeded","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Internal server error"}},"security":[{"ApiKeyAuth":[]}],"summary":"List subscriptions","tags":["Subscriptions"]},"post":{"description":"Creates an address subscription to monitor blockchain activity.","operationId":"postSubscriptions","parameters":[{"description":"API version (defaults to the latest supported version if omitted).","in":"header","name":"API-Version","required":false,"schema":{"default":"v1","enum":["v1"],"type":"string"}},{"description":"Unique key (1-255 printable ASCII chars) used to safely retry write operations. Same key + body returns the cached response; same key + different body returns 409.","in":"header","name":"Idempotency-Key","required":false,"schema":{"maxLength":255,"minLength":1,"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSubscriptionRequest"}}},"required":true},"responses":{"201":{"content":{"application/json":{"example":{"address":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e","chain":"ethereum","created_at":"2026-05-16T10:30:00Z","event_type":"incoming_token_tx","has_signing_secret":true,"id":"7c9e6679-7425-40de-944b-e07fc1f90ae7","label":"Customer deposit monitor","last_event_at":"2026-05-16T10:30:00Z","network":"mainnet","object":"subscription","status":"active","updated_at":"2026-05-16T10:30:00Z","webhook_url":"https://example.com/webhooks/bitnob"},"schema":{"$ref":"#/components/schemas/SubscriptionResponse"}}},"description":"Created","headers":{"Idempotent-Replayed":{"description":"True when this response was replayed from an earlier request with the same Idempotency-Key.","schema":{"type":"boolean"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix time (seconds) at which the rate-limit window resets.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"Scope the rate limit was applied at.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for this request; quote it in support requests.","schema":{"type":"string"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Authentication required"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Insufficient permissions"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Conflict"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limit exceeded","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Internal server error"}},"security":[{"ApiKeyAuth":[]}],"summary":"Create subscription","tags":["Subscriptions"]}},"/subscriptions/events":{"get":{"description":"Returns a paginated list of on-chain delivery events for this organization across all subscriptions, newest first. Filter to a single subscription with the subscription_id query param.","operationId":"getSubscriptionsEvents","parameters":[{"description":"API version (defaults to the latest supported version if omitted).","in":"header","name":"API-Version","required":false,"schema":{"default":"v1","enum":["v1"],"type":"string"}},{"description":"Opaque cursor; returns the page after this item.","in":"query","name":"starting_after","required":false,"schema":{"type":"string"}},{"description":"Opaque cursor; returns the page before this item.","in":"query","name":"ending_before","required":false,"schema":{"type":"string"}},{"description":"Page size; bounded by the endpoint maximum.","in":"query","name":"limit","required":false,"schema":{"type":"integer"}},{"description":"Filter by delivery status.","in":"query","name":"status","required":false,"schema":{"enum":["pending","delivered","failed"],"type":"string"}},{"description":"Narrow the listing to a single subscription.","in":"query","name":"subscription_id","required":false,"schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"content":{"application/json":{"example":{"data":[{"created_at":"2026-05-16T10:30:00Z","delivered_at":"2026-05-16T10:30:00Z","delivery_attempts":1,"delivery_status":"delivered","destination":"https://example.com/webhooks/bitnob","http_status_code":200,"id":"9b2e7a1c-3d4f-4a8b-9c0d-1e2f3a4b5c6d","max_attempts":5,"next_retry_at":"2026-05-16T10:30:00Z","object":"event","type":"transaction.confirmed","webhook_id":"7c9e6679-7425-40de-944b-e07fc1f90ae7"}],"has_more":false,"next_cursor":"","object":"list","url":""},"schema":{"properties":{"data":{"items":{"$ref":"#/components/schemas/EventResponse"},"type":"array"},"has_more":{"type":"boolean"},"next_cursor":{"description":"Opaque cursor for the next page; pass as starting_after. Present only when has_more is true.","type":"string"},"object":{"example":"list","type":"string"},"url":{"type":"string"}},"type":"object"}}},"description":"Success","headers":{"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix time (seconds) at which the rate-limit window resets.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"Scope the rate limit was applied at.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for this request; quote it in support requests.","schema":{"type":"string"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Authentication required"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Insufficient permissions"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limit exceeded","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Internal server error"}},"security":[{"ApiKeyAuth":[]}],"summary":"List subscription delivery events","tags":["Subscriptions"]}},"/subscriptions/events/{id}":{"get":{"description":"Returns a single delivery event by ID. The event must belong to a subscription owned by the caller's organization.","operationId":"getSubscriptionsEventsById","parameters":[{"description":"Event ID","in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}},{"description":"API version (defaults to the latest supported version if omitted).","in":"header","name":"API-Version","required":false,"schema":{"default":"v1","enum":["v1"],"type":"string"}}],"responses":{"200":{"content":{"application/json":{"example":{"created_at":"2026-05-16T10:30:00Z","delivered_at":"2026-05-16T10:30:00Z","delivery_attempts":1,"delivery_status":"delivered","destination":"https://example.com/webhooks/bitnob","http_status_code":200,"id":"9b2e7a1c-3d4f-4a8b-9c0d-1e2f3a4b5c6d","max_attempts":5,"next_retry_at":"2026-05-16T10:30:00Z","object":"event","type":"transaction.confirmed","webhook_id":"7c9e6679-7425-40de-944b-e07fc1f90ae7"},"schema":{"$ref":"#/components/schemas/EventResponse"}}},"description":"Success","headers":{"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix time (seconds) at which the rate-limit window resets.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"Scope the rate limit was applied at.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for this request; quote it in support requests.","schema":{"type":"string"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Authentication required"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Insufficient permissions"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Not found"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limit exceeded","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Internal server error"}},"security":[{"ApiKeyAuth":[]}],"summary":"Get subscription delivery event","tags":["Subscriptions"]}},"/subscriptions/events/{id}/retry":{"post":{"description":"Re-queues the specified delivery for another attempt. Org ownership is enforced via the delivery's parent subscription.","operationId":"postSubscriptionsEventsByIdRetry","parameters":[{"description":"Event ID","in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}},{"description":"API version (defaults to the latest supported version if omitted).","in":"header","name":"API-Version","required":false,"schema":{"default":"v1","enum":["v1"],"type":"string"}},{"description":"Unique key (1-255 printable ASCII chars) used to safely retry write operations. Same key + body returns the cached response; same key + different body returns 409.","in":"header","name":"Idempotency-Key","required":false,"schema":{"maxLength":255,"minLength":1,"type":"string"}}],"responses":{"200":{"content":{"application/json":{"example":{"object":"event_retry","status":"queued"},"schema":{"$ref":"#/components/schemas/EventRetryResponse"}}},"description":"Success","headers":{"Idempotent-Replayed":{"description":"True when this response was replayed from an earlier request with the same Idempotency-Key.","schema":{"type":"boolean"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix time (seconds) at which the rate-limit window resets.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"Scope the rate limit was applied at.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for this request; quote it in support requests.","schema":{"type":"string"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Authentication required"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Insufficient permissions"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Not found"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Conflict"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limit exceeded","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Internal server error"}},"security":[{"ApiKeyAuth":[]}],"summary":"Retry subscription delivery","tags":["Subscriptions"]}},"/subscriptions/{id}":{"delete":{"description":"Soft-deletes a subscription and removes it from the provider.","operationId":"deleteSubscriptionsById","parameters":[{"description":"Subscription ID","in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}},{"description":"API version (defaults to the latest supported version if omitted).","in":"header","name":"API-Version","required":false,"schema":{"default":"v1","enum":["v1"],"type":"string"}},{"description":"Unique key (1-255 printable ASCII chars) used to safely retry write operations. Same key + body returns the cached response; same key + different body returns 409.","in":"header","name":"Idempotency-Key","required":false,"schema":{"maxLength":255,"minLength":1,"type":"string"}}],"responses":{"204":{"description":"No Content","headers":{"Idempotent-Replayed":{"description":"True when this response was replayed from an earlier request with the same Idempotency-Key.","schema":{"type":"boolean"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix time (seconds) at which the rate-limit window resets.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"Scope the rate limit was applied at.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for this request; quote it in support requests.","schema":{"type":"string"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Authentication required"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Insufficient permissions"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Not found"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Conflict"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limit exceeded","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Internal server error"}},"security":[{"ApiKeyAuth":[]}],"summary":"Delete subscription","tags":["Subscriptions"]},"get":{"description":"Returns a single subscription by ID.","operationId":"getSubscriptionsById","parameters":[{"description":"Subscription ID","in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}},{"description":"API version (defaults to the latest supported version if omitted).","in":"header","name":"API-Version","required":false,"schema":{"default":"v1","enum":["v1"],"type":"string"}}],"responses":{"200":{"content":{"application/json":{"example":{"address":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e","chain":"ethereum","created_at":"2026-05-16T10:30:00Z","event_type":"incoming_token_tx","has_signing_secret":true,"id":"7c9e6679-7425-40de-944b-e07fc1f90ae7","label":"Customer deposit monitor","last_event_at":"2026-05-16T10:30:00Z","network":"mainnet","object":"subscription","status":"active","updated_at":"2026-05-16T10:30:00Z","webhook_url":"https://example.com/webhooks/bitnob"},"schema":{"$ref":"#/components/schemas/SubscriptionResponse"}}},"description":"Success","headers":{"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix time (seconds) at which the rate-limit window resets.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"Scope the rate limit was applied at.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for this request; quote it in support requests.","schema":{"type":"string"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Authentication required"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Insufficient permissions"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Not found"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limit exceeded","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Internal server error"}},"security":[{"ApiKeyAuth":[]}],"summary":"Get subscription","tags":["Subscriptions"]},"patch":{"description":"Partially updates a subscription.","operationId":"patchSubscriptionsById","parameters":[{"description":"Subscription ID","in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}},{"description":"API version (defaults to the latest supported version if omitted).","in":"header","name":"API-Version","required":false,"schema":{"default":"v1","enum":["v1"],"type":"string"}},{"description":"Unique key (1-255 printable ASCII chars) used to safely retry write operations. Same key + body returns the cached response; same key + different body returns 409.","in":"header","name":"Idempotency-Key","required":false,"schema":{"maxLength":255,"minLength":1,"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateSubscriptionRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"example":{"address":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e","chain":"ethereum","created_at":"2026-05-16T10:30:00Z","event_type":"incoming_token_tx","has_signing_secret":true,"id":"7c9e6679-7425-40de-944b-e07fc1f90ae7","label":"Customer deposit monitor","last_event_at":"2026-05-16T10:30:00Z","network":"mainnet","object":"subscription","status":"active","updated_at":"2026-05-16T10:30:00Z","webhook_url":"https://example.com/webhooks/bitnob"},"schema":{"$ref":"#/components/schemas/SubscriptionResponse"}}},"description":"Success","headers":{"Idempotent-Replayed":{"description":"True when this response was replayed from an earlier request with the same Idempotency-Key.","schema":{"type":"boolean"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix time (seconds) at which the rate-limit window resets.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"Scope the rate limit was applied at.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for this request; quote it in support requests.","schema":{"type":"string"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Authentication required"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Insufficient permissions"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Not found"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Conflict"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limit exceeded","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Internal server error"}},"security":[{"ApiKeyAuth":[]}],"summary":"Update subscription","tags":["Subscriptions"]}},"/subscriptions/{id}/rotate-secret":{"post":{"description":"Generates a new HMAC signing secret for this subscription's webhook URL. The new secret is returned once.","operationId":"postSubscriptionsByIdRotate-secret","parameters":[{"description":"Subscription ID","in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}},{"description":"API version (defaults to the latest supported version if omitted).","in":"header","name":"API-Version","required":false,"schema":{"default":"v1","enum":["v1"],"type":"string"}},{"description":"Unique key (1-255 printable ASCII chars) used to safely retry write operations. Same key + body returns the cached response; same key + different body returns 409.","in":"header","name":"Idempotency-Key","required":false,"schema":{"maxLength":255,"minLength":1,"type":"string"}}],"responses":{"200":{"content":{"application/json":{"example":{"object":"signing_secret"},"schema":{"$ref":"#/components/schemas/SigningSecretResponse"}}},"description":"Success","headers":{"Idempotent-Replayed":{"description":"True when this response was replayed from an earlier request with the same Idempotency-Key.","schema":{"type":"boolean"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix time (seconds) at which the rate-limit window resets.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"Scope the rate limit was applied at.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for this request; quote it in support requests.","schema":{"type":"string"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Authentication required"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Insufficient permissions"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Not found"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Conflict"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limit exceeded","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Internal server error"}},"security":[{"ApiKeyAuth":[]}],"summary":"Rotate signing secret","tags":["Subscriptions"]}},"/transactions":{"get":{"description":"Returns a paginated list of transactions. Filterable by wallet_id, status, direction, asset, and created_at range.","operationId":"getTransactions","parameters":[{"description":"API version (defaults to the latest supported version if omitted).","in":"header","name":"API-Version","required":false,"schema":{"default":"v1","enum":["v1"],"type":"string"}},{"description":"Opaque cursor; returns the page after this item.","in":"query","name":"starting_after","required":false,"schema":{"type":"string"}},{"description":"Opaque cursor; returns the page before this item.","in":"query","name":"ending_before","required":false,"schema":{"type":"string"}},{"description":"Page size; bounded by the endpoint maximum.","in":"query","name":"limit","required":false,"schema":{"type":"integer"}},{"description":"Filter by wallet UUID.","in":"query","name":"wallet_id","required":false,"schema":{"format":"uuid","type":"string"}},{"description":"Filter by transaction status.","in":"query","name":"status","required":false,"schema":{"type":"string"}},{"description":"Filter by direction.","in":"query","name":"direction","required":false,"schema":{"enum":["inbound","outbound"],"type":"string"}},{"description":"Filter by asset symbol (e.g. USDT).","in":"query","name":"asset","required":false,"schema":{"type":"string"}},{"description":"Created at \u003e= this RFC3339 timestamp.","in":"query","name":"created_at[gte]","required":false,"schema":{"format":"date-time","type":"string"}},{"description":"Created at \u003c= this RFC3339 timestamp.","in":"query","name":"created_at[lte]","required":false,"schema":{"format":"date-time","type":"string"}}],"responses":{"200":{"content":{"application/json":{"example":{"data":[{"amount":"25.5","amount_raw":"25500000","asset":"USDC","asset_decimals":6,"block_hash":"0x8f4c1b8e2a7d3f06c5b1a09e8d7c6f5e4d3c2b1a09f8e7d6c5b4a3928170615f","block_number":21345678,"broadcast_at":"2026-05-16T10:30:02Z","chain":"ethereum","completed_at":"2026-05-16T10:30:45Z","confirmations":12,"created_at":"2026-05-16T10:30:00Z","direction":"outbound","execute_at":"2026-05-16T11:30:00Z","fee_amount":"0.0012","fee_amount_raw":"1200000000000000","fee_asset":"ETH","fee_decimals":18,"from_address":"0x3f5CE5FBFe3E9af3971dD833D26bA9b5C936f0bE","gas_station_id":"9b2e7a1c-3d4f-4a8b-9c0d-1e2f3a4b5c6d","id":"7c9e6679-7425-40de-944b-e07fc1f90ae7","network":"mainnet","note":"Invoice 4471 payout","object":"transaction","realized_fee_amount":"0.001","realized_fee_amount_raw":"1000000000000000","realized_fee_asset":"ETH","realized_fee_decimals":18,"signed_at":"2026-05-16T10:30:01Z","sponsored":false,"status":"completed","to_address":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e","tx_hash":"0x9f4c1b8e2a7d3f06c5b1a09e8d7c6f5e4d3c2b1a09f8e7d6c5b4a3928170615f","wallet_id":"a1b2c3d4-5e6f-7a8b-9c0d-1e2f3a4b5c6d"}],"has_more":false,"next_cursor":"","object":"list","url":""},"schema":{"properties":{"data":{"items":{"$ref":"#/components/schemas/TransactionResponse"},"type":"array"},"has_more":{"type":"boolean"},"next_cursor":{"description":"Opaque cursor for the next page; pass as starting_after. Present only when has_more is true.","type":"string"},"object":{"example":"list","type":"string"},"url":{"type":"string"}},"type":"object"}}},"description":"Success","headers":{"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix time (seconds) at which the rate-limit window resets.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"Scope the rate limit was applied at.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for this request; quote it in support requests.","schema":{"type":"string"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Authentication required"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Insufficient permissions"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limit exceeded","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Internal server error"}},"security":[{"ApiKeyAuth":[]}],"summary":"List transactions","tags":["Transactions"]},"post":{"description":"Creates a new transaction. The transaction is automatically signed using your API key credentials and submitted for broadcast. Requires the Idempotency-Key header.\n\nOutcomes:\n- **201 Created**: signed and submitted; poll `status` until a terminal state.\n- **202 Accepted**: not yet executing — the body's `status` says why:\n  - `pending_authorization`: organization policy requires approval; the transaction executes once approvers approve.\n  - `delayed`: a policy time-lock holds the transaction until `execute_at`, when the worker executes it automatically.\n  In both cases the transaction is durably persisted (funds locked) — poll `GET /v1/transactions/{id}` for the resolution.\n\nBitcoin coin control: set `inputs` to pin the exact UTXOs to spend (enumerate selectable coins via `GET /v1/wallets/{id}/utxos?spendable=true`); set `fill_fee_from_unselected` to let the rest of the wallet top up the fee. Coin control is not supported with `treat_as_gross_amount`, or when the transaction would require approval or a policy time-delay.","operationId":"postTransactions","parameters":[{"description":"API version (defaults to the latest supported version if omitted).","in":"header","name":"API-Version","required":false,"schema":{"default":"v1","enum":["v1"],"type":"string"}},{"description":"Unique key (1-255 printable ASCII chars) used to safely retry write operations. Same key + body returns the cached response; same key + different body returns 409.","in":"header","name":"Idempotency-Key","required":true,"schema":{"maxLength":255,"minLength":1,"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTransactionRequest"}}},"required":true},"responses":{"201":{"content":{"application/json":{"example":{"amount":"25.5","amount_raw":"25500000","asset":"USDC","asset_decimals":6,"block_hash":"0x8f4c1b8e2a7d3f06c5b1a09e8d7c6f5e4d3c2b1a09f8e7d6c5b4a3928170615f","block_number":21345678,"broadcast_at":"2026-05-16T10:30:02Z","chain":"ethereum","completed_at":"2026-05-16T10:30:45Z","confirmations":12,"created_at":"2026-05-16T10:30:00Z","direction":"outbound","execute_at":"2026-05-16T11:30:00Z","fee_amount":"0.0012","fee_amount_raw":"1200000000000000","fee_asset":"ETH","fee_decimals":18,"from_address":"0x3f5CE5FBFe3E9af3971dD833D26bA9b5C936f0bE","gas_station_id":"9b2e7a1c-3d4f-4a8b-9c0d-1e2f3a4b5c6d","id":"7c9e6679-7425-40de-944b-e07fc1f90ae7","network":"mainnet","note":"Invoice 4471 payout","object":"transaction","realized_fee_amount":"0.001","realized_fee_amount_raw":"1000000000000000","realized_fee_asset":"ETH","realized_fee_decimals":18,"signed_at":"2026-05-16T10:30:01Z","sponsored":false,"status":"completed","to_address":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e","tx_hash":"0x9f4c1b8e2a7d3f06c5b1a09e8d7c6f5e4d3c2b1a09f8e7d6c5b4a3928170615f","wallet_id":"a1b2c3d4-5e6f-7a8b-9c0d-1e2f3a4b5c6d"},"schema":{"$ref":"#/components/schemas/TransactionResponse"}}},"description":"Created","headers":{"Idempotent-Replayed":{"description":"True when this response was replayed from an earlier request with the same Idempotency-Key.","schema":{"type":"boolean"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix time (seconds) at which the rate-limit window resets.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"Scope the rate limit was applied at.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for this request; quote it in support requests.","schema":{"type":"string"}}}},"202":{"content":{"application/json":{"example":{"amount":"25.5","amount_raw":"25500000","asset":"USDC","asset_decimals":6,"block_hash":"0x8f4c1b8e2a7d3f06c5b1a09e8d7c6f5e4d3c2b1a09f8e7d6c5b4a3928170615f","block_number":21345678,"broadcast_at":"2026-05-16T10:30:02Z","chain":"ethereum","completed_at":"2026-05-16T10:30:45Z","confirmations":12,"created_at":"2026-05-16T10:30:00Z","direction":"outbound","execute_at":"2026-05-16T11:30:00Z","fee_amount":"0.0012","fee_amount_raw":"1200000000000000","fee_asset":"ETH","fee_decimals":18,"from_address":"0x3f5CE5FBFe3E9af3971dD833D26bA9b5C936f0bE","gas_station_id":"9b2e7a1c-3d4f-4a8b-9c0d-1e2f3a4b5c6d","id":"7c9e6679-7425-40de-944b-e07fc1f90ae7","network":"mainnet","note":"Invoice 4471 payout","object":"transaction","realized_fee_amount":"0.001","realized_fee_amount_raw":"1000000000000000","realized_fee_asset":"ETH","realized_fee_decimals":18,"signed_at":"2026-05-16T10:30:01Z","sponsored":false,"status":"completed","to_address":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e","tx_hash":"0x9f4c1b8e2a7d3f06c5b1a09e8d7c6f5e4d3c2b1a09f8e7d6c5b4a3928170615f","wallet_id":"a1b2c3d4-5e6f-7a8b-9c0d-1e2f3a4b5c6d"},"schema":{"$ref":"#/components/schemas/TransactionResponse"}}},"description":"Accepted but not yet executing — pending approval (status=pending_authorization) or policy-delayed (status=delayed, with execute_at). Poll GET /v1/transactions/{id}.","headers":{"Idempotent-Replayed":{"description":"True when this response was replayed from an earlier request with the same Idempotency-Key.","schema":{"type":"boolean"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix time (seconds) at which the rate-limit window resets.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"Scope the rate limit was applied at.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for this request; quote it in support requests.","schema":{"type":"string"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Authentication required"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Insufficient permissions"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Conflict"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limit exceeded","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Internal server error"}},"security":[{"ApiKeyAuth":[]}],"summary":"Create transaction","tags":["Transactions"]}},"/transactions/estimate-fee":{"post":{"description":"Returns low, medium, and high fee quotes for a transaction, including gas-funding options and any same-asset settlement totals.","operationId":"postTransactionsEstimate-fee","parameters":[{"description":"API version (defaults to the latest supported version if omitted).","in":"header","name":"API-Version","required":false,"schema":{"default":"v1","enum":["v1"],"type":"string"}},{"description":"Unique key (1-255 printable ASCII chars) used to safely retry write operations. Same key + body returns the cached response; same key + different body returns 409.","in":"header","name":"Idempotency-Key","required":false,"schema":{"maxLength":255,"minLength":1,"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EstimateTransactionFeeRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"example":{"fee_levels":{"high":{"amount":"0.0012","amount_raw":"1200000000000000","breakdown":[{"key":"base_fee","label":"Base fee","unit":"ETH","value":"0.0009"}],"estimated_time_seconds":30,"usd_value":"3.45"},"low":{"amount":"0.0012","amount_raw":"1200000000000000","breakdown":[{"key":"base_fee","label":"Base fee","unit":"ETH","value":"0.0009"}],"estimated_time_seconds":30,"usd_value":"3.45"},"medium":{"amount":"0.0012","amount_raw":"1200000000000000","breakdown":[{"key":"base_fee","label":"Base fee","unit":"ETH","value":"0.0009"}],"estimated_time_seconds":30,"usd_value":"3.45"}},"recommended":"medium"},"schema":{"$ref":"#/components/schemas/FeeEstimationResponse"}}},"description":"Success","headers":{"Idempotent-Replayed":{"description":"True when this response was replayed from an earlier request with the same Idempotency-Key.","schema":{"type":"boolean"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix time (seconds) at which the rate-limit window resets.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"Scope the rate limit was applied at.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for this request; quote it in support requests.","schema":{"type":"string"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Authentication required"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Insufficient permissions"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Conflict"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limit exceeded","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Internal server error"}},"security":[{"ApiKeyAuth":[]}],"summary":"Estimate transaction fee","tags":["Transactions"]}},"/transactions/{id}":{"get":{"description":"Returns a single transaction by ID.","operationId":"getTransactionsById","parameters":[{"description":"Transaction ID","in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}},{"description":"API version (defaults to the latest supported version if omitted).","in":"header","name":"API-Version","required":false,"schema":{"default":"v1","enum":["v1"],"type":"string"}}],"responses":{"200":{"content":{"application/json":{"example":{"amount":"25.5","amount_raw":"25500000","asset":"USDC","asset_decimals":6,"block_hash":"0x8f4c1b8e2a7d3f06c5b1a09e8d7c6f5e4d3c2b1a09f8e7d6c5b4a3928170615f","block_number":21345678,"broadcast_at":"2026-05-16T10:30:02Z","chain":"ethereum","completed_at":"2026-05-16T10:30:45Z","confirmations":12,"created_at":"2026-05-16T10:30:00Z","direction":"outbound","execute_at":"2026-05-16T11:30:00Z","fee_amount":"0.0012","fee_amount_raw":"1200000000000000","fee_asset":"ETH","fee_decimals":18,"from_address":"0x3f5CE5FBFe3E9af3971dD833D26bA9b5C936f0bE","gas_station_id":"9b2e7a1c-3d4f-4a8b-9c0d-1e2f3a4b5c6d","id":"7c9e6679-7425-40de-944b-e07fc1f90ae7","network":"mainnet","note":"Invoice 4471 payout","object":"transaction","realized_fee_amount":"0.001","realized_fee_amount_raw":"1000000000000000","realized_fee_asset":"ETH","realized_fee_decimals":18,"signed_at":"2026-05-16T10:30:01Z","sponsored":false,"status":"completed","to_address":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e","tx_hash":"0x9f4c1b8e2a7d3f06c5b1a09e8d7c6f5e4d3c2b1a09f8e7d6c5b4a3928170615f","wallet_id":"a1b2c3d4-5e6f-7a8b-9c0d-1e2f3a4b5c6d"},"schema":{"$ref":"#/components/schemas/TransactionResponse"}}},"description":"Success","headers":{"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix time (seconds) at which the rate-limit window resets.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"Scope the rate limit was applied at.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for this request; quote it in support requests.","schema":{"type":"string"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Authentication required"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Insufficient permissions"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Not found"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limit exceeded","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Internal server error"}},"security":[{"ApiKeyAuth":[]}],"summary":"Get transaction","tags":["Transactions"]}},"/users/approver-candidates":{"get":{"description":"Returns the org members and roles that can be used as `approvers` entries in a `require_approval` action config. Use the returned `id` as `approvers[].id` and the `type` field as `approvers[].type` when constructing policy rules.\n\nBoth `user` and `role` entries are included. A `role` entry covers all org members currently assigned that role; `member_count` reflects the live count. Role IDs are stable identifiers (e.g. `admin`, `operator`) — they do not change when members join or leave.","operationId":"getUsersApprover-candidates","parameters":[{"description":"API version (defaults to the latest supported version if omitted).","in":"header","name":"API-Version","required":false,"schema":{"default":"v1","enum":["v1"],"type":"string"}}],"responses":{"200":{"content":{"application/json":{"example":{"data":[{"id":"3f1a2b3c-4d5e-6f7a-8b9c-0d1e2f3a4b5c","name":"Ebot Ndip","object":"approver_candidate","type":"user"}],"has_more":false,"next_cursor":"","object":"list","url":""},"schema":{"properties":{"data":{"items":{"$ref":"#/components/schemas/ApproverCandidateResponse"},"type":"array"},"has_more":{"type":"boolean"},"next_cursor":{"description":"Opaque cursor for the next page; pass as starting_after. Present only when has_more is true.","type":"string"},"object":{"example":"list","type":"string"},"url":{"type":"string"}},"type":"object"}}},"description":"Success","headers":{"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix time (seconds) at which the rate-limit window resets.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"Scope the rate limit was applied at.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for this request; quote it in support requests.","schema":{"type":"string"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Authentication required"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Insufficient permissions"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limit exceeded","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Internal server error"}},"security":[{"ApiKeyAuth":[]}],"summary":"List approver candidates","tags":["Users"]}},"/vaults":{"get":{"description":"Returns vaults for the organization. Filterable by vault_type and status.","operationId":"getVaults","parameters":[{"description":"API version (defaults to the latest supported version if omitted).","in":"header","name":"API-Version","required":false,"schema":{"default":"v1","enum":["v1"],"type":"string"}},{"description":"Opaque cursor; returns the page after this item.","in":"query","name":"starting_after","required":false,"schema":{"type":"string"}},{"description":"Opaque cursor; returns the page before this item.","in":"query","name":"ending_before","required":false,"schema":{"type":"string"}},{"description":"Page size; bounded by the endpoint maximum.","in":"query","name":"limit","required":false,"schema":{"type":"integer"}},{"description":"Filter by vault type.","in":"query","name":"vault_type","required":false,"schema":{"enum":["dedicated","pool"],"type":"string"}},{"description":"Filter by status.","in":"query","name":"status","required":false,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"example":{"data":[{"created_at":"2026-05-16T10:30:00Z","id":"f47ac10b-58cc-4372-a567-0e02b2c3d479","name":"Treasury vault","object":"vault","status":"active","updated_at":"2026-05-16T10:30:00Z","wallet_count":3}],"has_more":false,"next_cursor":"","object":"list","url":""},"schema":{"properties":{"data":{"items":{"$ref":"#/components/schemas/VaultResponse"},"type":"array"},"has_more":{"type":"boolean"},"next_cursor":{"description":"Opaque cursor for the next page; pass as starting_after. Present only when has_more is true.","type":"string"},"object":{"example":"list","type":"string"},"url":{"type":"string"}},"type":"object"}}},"description":"Success","headers":{"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix time (seconds) at which the rate-limit window resets.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"Scope the rate limit was applied at.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for this request; quote it in support requests.","schema":{"type":"string"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Authentication required"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Insufficient permissions"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limit exceeded","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Internal server error"}},"security":[{"ApiKeyAuth":[]}],"summary":"List vaults","tags":["Vaults"]}},"/vaults/{id}":{"get":{"description":"Returns a single vault by ID with wallet count.","operationId":"getVaultsById","parameters":[{"description":"Vault ID","in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}},{"description":"API version (defaults to the latest supported version if omitted).","in":"header","name":"API-Version","required":false,"schema":{"default":"v1","enum":["v1"],"type":"string"}}],"responses":{"200":{"content":{"application/json":{"example":{"created_at":"2026-05-16T10:30:00Z","id":"f47ac10b-58cc-4372-a567-0e02b2c3d479","name":"Treasury vault","object":"vault","status":"active","updated_at":"2026-05-16T10:30:00Z","wallet_count":3},"schema":{"$ref":"#/components/schemas/VaultResponse"}}},"description":"Success","headers":{"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix time (seconds) at which the rate-limit window resets.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"Scope the rate limit was applied at.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for this request; quote it in support requests.","schema":{"type":"string"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Authentication required"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Insufficient permissions"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Not found"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limit exceeded","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Internal server error"}},"security":[{"ApiKeyAuth":[]}],"summary":"Get vault","tags":["Vaults"]}},"/vaults/{vaultId}/consolidation/rules":{"get":{"description":"Returns all consolidation rules configured on the given vault.","operationId":"getVaultsByVaultIdConsolidationRules","parameters":[{"description":"Vault ID","in":"path","name":"vaultId","required":true,"schema":{"type":"string"}},{"description":"API version (defaults to the latest supported version if omitted).","in":"header","name":"API-Version","required":false,"schema":{"default":"v1","enum":["v1"],"type":"string"}}],"responses":{"200":{"content":{"application/json":{"example":{"data":[],"has_more":false,"next_cursor":"","object":"list","url":""},"schema":{"properties":{"data":{"items":{"$ref":"#/components/schemas/PublicConsolidationRuleResponse"},"type":"array"},"has_more":{"type":"boolean"},"next_cursor":{"description":"Opaque cursor for the next page; pass as starting_after. Present only when has_more is true.","type":"string"},"object":{"example":"list","type":"string"},"url":{"type":"string"}},"type":"object"}}},"description":"Success","headers":{"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix time (seconds) at which the rate-limit window resets.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"Scope the rate limit was applied at.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for this request; quote it in support requests.","schema":{"type":"string"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Authentication required"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Insufficient permissions"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Not found"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limit exceeded","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Internal server error"}},"security":[{"ApiKeyAuth":[]}],"summary":"List consolidation rules for a vault","tags":["Meta"]},"post":{"description":"Creates a vault consolidation rule for a (vault, chain, network). Exactly one of destination_address_book_id / destination_vault_id must be set, matching destination_type.","operationId":"postVaultsByVaultIdConsolidationRules","parameters":[{"description":"Vault ID","in":"path","name":"vaultId","required":true,"schema":{"type":"string"}},{"description":"API version (defaults to the latest supported version if omitted).","in":"header","name":"API-Version","required":false,"schema":{"default":"v1","enum":["v1"],"type":"string"}},{"description":"Unique key (1-255 printable ASCII chars) used to safely retry write operations. Same key + body returns the cached response; same key + different body returns 409.","in":"header","name":"Idempotency-Key","required":false,"schema":{"maxLength":255,"minLength":1,"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicCreateConsolidationRuleRequest"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicConsolidationRuleResponse"}}},"description":"Created","headers":{"Idempotent-Replayed":{"description":"True when this response was replayed from an earlier request with the same Idempotency-Key.","schema":{"type":"boolean"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix time (seconds) at which the rate-limit window resets.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"Scope the rate limit was applied at.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for this request; quote it in support requests.","schema":{"type":"string"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Authentication required"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Insufficient permissions"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Not found"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Conflict"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limit exceeded","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Internal server error"}},"security":[{"ApiKeyAuth":[]}],"summary":"Create consolidation rule","tags":["Meta"]}},"/wallets":{"get":{"description":"Returns a paginated list of wallets. Supports expand[]=addresses, chain, and status filters.","operationId":"getWallets","parameters":[{"description":"API version (defaults to the latest supported version if omitted).","in":"header","name":"API-Version","required":false,"schema":{"default":"v1","enum":["v1"],"type":"string"}},{"description":"Opaque cursor; returns the page after this item.","in":"query","name":"starting_after","required":false,"schema":{"type":"string"}},{"description":"Opaque cursor; returns the page before this item.","in":"query","name":"ending_before","required":false,"schema":{"type":"string"}},{"description":"Page size; bounded by the endpoint maximum.","in":"query","name":"limit","required":false,"schema":{"type":"integer"}},{"description":"Filter by chain.","in":"query","name":"chain","required":false,"schema":{"type":"string"}},{"description":"Filter by wallet status.","in":"query","name":"status","required":false,"schema":{"type":"string"}},{"description":"Expand related resources inline (e.g. addresses).","in":"query","name":"expand[]","required":false,"schema":{"items":{"type":"string"},"type":"array"}}],"responses":{"200":{"content":{"application/json":{"example":{"data":[{"addresses":[{"address":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e","chain":"ethereum","created_at":"2026-05-16T10:30:00Z","id":"3f1a2b3c-4d5e-6f7a-8b9c-0d1e2f3a4b5c","is_primary":true,"label":"Customer deposits","network":"mainnet","object":"address","wallet_id":"a1b2c3d4-5e6f-7a8b-9c0d-1e2f3a4b5c6d"}],"chain":"ethereum","created_at":"2026-05-16T10:30:00Z","customer_ref_id":"cust_8842","id":"a1b2c3d4-5e6f-7a8b-9c0d-1e2f3a4b5c6d","name":"Treasury wallet","object":"wallet","primary_address":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e","status":"active","updated_at":"2026-05-16T10:30:00Z","vault_id":"f47ac10b-58cc-4372-a567-0e02b2c3d479","wallet_type":"hot"}],"has_more":false,"next_cursor":"","object":"list","url":""},"schema":{"properties":{"data":{"items":{"$ref":"#/components/schemas/WalletResponse"},"type":"array"},"has_more":{"type":"boolean"},"next_cursor":{"description":"Opaque cursor for the next page; pass as starting_after. Present only when has_more is true.","type":"string"},"object":{"example":"list","type":"string"},"url":{"type":"string"}},"type":"object"}}},"description":"Success","headers":{"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix time (seconds) at which the rate-limit window resets.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"Scope the rate limit was applied at.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for this request; quote it in support requests.","schema":{"type":"string"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Authentication required"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Insufficient permissions"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limit exceeded","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Internal server error"}},"security":[{"ApiKeyAuth":[]}],"summary":"List wallets","tags":["Wallets"]},"post":{"description":"Creates a new wallet inside an existing vault, scoped to the given chain. vault_id is required — create the vault first, then create wallets under it. The chain's native primary address is auto-provisioned as part of creation; partners do not need a second call. Use POST /wallets/:id/addresses afterwards only for Bitcoin (which permits multiple addresses) — account-based chains return the same primary on subsequent calls.","operationId":"postWallets","parameters":[{"description":"API version (defaults to the latest supported version if omitted).","in":"header","name":"API-Version","required":false,"schema":{"default":"v1","enum":["v1"],"type":"string"}},{"description":"Unique key (1-255 printable ASCII chars) used to safely retry write operations. Same key + body returns the cached response; same key + different body returns 409.","in":"header","name":"Idempotency-Key","required":true,"schema":{"maxLength":255,"minLength":1,"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateWalletRequest"}}},"required":true},"responses":{"201":{"content":{"application/json":{"example":{"addresses":[{"address":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e","chain":"ethereum","created_at":"2026-05-16T10:30:00Z","id":"3f1a2b3c-4d5e-6f7a-8b9c-0d1e2f3a4b5c","is_primary":true,"label":"Customer deposits","network":"mainnet","object":"address","wallet_id":"a1b2c3d4-5e6f-7a8b-9c0d-1e2f3a4b5c6d"}],"chain":"ethereum","created_at":"2026-05-16T10:30:00Z","customer_ref_id":"cust_8842","id":"a1b2c3d4-5e6f-7a8b-9c0d-1e2f3a4b5c6d","name":"Treasury wallet","object":"wallet","primary_address":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e","status":"active","updated_at":"2026-05-16T10:30:00Z","vault_id":"f47ac10b-58cc-4372-a567-0e02b2c3d479","wallet_type":"hot"},"schema":{"$ref":"#/components/schemas/WalletResponse"}}},"description":"Created","headers":{"Idempotent-Replayed":{"description":"True when this response was replayed from an earlier request with the same Idempotency-Key.","schema":{"type":"boolean"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix time (seconds) at which the rate-limit window resets.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"Scope the rate limit was applied at.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for this request; quote it in support requests.","schema":{"type":"string"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Authentication required"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Insufficient permissions"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Conflict"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limit exceeded","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Internal server error"}},"security":[{"ApiKeyAuth":[]}],"summary":"Create wallet","tags":["Wallets"]}},"/wallets/{id}":{"get":{"description":"Returns a single wallet by ID. Supports expand[]=addresses.","operationId":"getWalletsById","parameters":[{"description":"Wallet ID","in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}},{"description":"API version (defaults to the latest supported version if omitted).","in":"header","name":"API-Version","required":false,"schema":{"default":"v1","enum":["v1"],"type":"string"}},{"description":"Expand related resources inline (e.g. addresses).","in":"query","name":"expand[]","required":false,"schema":{"items":{"type":"string"},"type":"array"}}],"responses":{"200":{"content":{"application/json":{"example":{"addresses":[{"address":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e","chain":"ethereum","created_at":"2026-05-16T10:30:00Z","id":"3f1a2b3c-4d5e-6f7a-8b9c-0d1e2f3a4b5c","is_primary":true,"label":"Customer deposits","network":"mainnet","object":"address","wallet_id":"a1b2c3d4-5e6f-7a8b-9c0d-1e2f3a4b5c6d"}],"chain":"ethereum","created_at":"2026-05-16T10:30:00Z","customer_ref_id":"cust_8842","id":"a1b2c3d4-5e6f-7a8b-9c0d-1e2f3a4b5c6d","name":"Treasury wallet","object":"wallet","primary_address":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e","status":"active","updated_at":"2026-05-16T10:30:00Z","vault_id":"f47ac10b-58cc-4372-a567-0e02b2c3d479","wallet_type":"hot"},"schema":{"$ref":"#/components/schemas/WalletResponse"}}},"description":"Success","headers":{"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix time (seconds) at which the rate-limit window resets.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"Scope the rate limit was applied at.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for this request; quote it in support requests.","schema":{"type":"string"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Authentication required"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Insufficient permissions"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Not found"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limit exceeded","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Internal server error"}},"security":[{"ApiKeyAuth":[]}],"summary":"Get wallet","tags":["Wallets"]},"patch":{"description":"Updates a wallet's name or metadata. Omitted fields are left unchanged.","operationId":"patchWalletsById","parameters":[{"description":"Wallet ID","in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}},{"description":"API version (defaults to the latest supported version if omitted).","in":"header","name":"API-Version","required":false,"schema":{"default":"v1","enum":["v1"],"type":"string"}},{"description":"Unique key (1-255 printable ASCII chars) used to safely retry write operations. Same key + body returns the cached response; same key + different body returns 409.","in":"header","name":"Idempotency-Key","required":false,"schema":{"maxLength":255,"minLength":1,"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateWalletRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"example":{"addresses":[{"address":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e","chain":"ethereum","created_at":"2026-05-16T10:30:00Z","id":"3f1a2b3c-4d5e-6f7a-8b9c-0d1e2f3a4b5c","is_primary":true,"label":"Customer deposits","network":"mainnet","object":"address","wallet_id":"a1b2c3d4-5e6f-7a8b-9c0d-1e2f3a4b5c6d"}],"chain":"ethereum","created_at":"2026-05-16T10:30:00Z","customer_ref_id":"cust_8842","id":"a1b2c3d4-5e6f-7a8b-9c0d-1e2f3a4b5c6d","name":"Treasury wallet","object":"wallet","primary_address":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e","status":"active","updated_at":"2026-05-16T10:30:00Z","vault_id":"f47ac10b-58cc-4372-a567-0e02b2c3d479","wallet_type":"hot"},"schema":{"$ref":"#/components/schemas/WalletResponse"}}},"description":"Success","headers":{"Idempotent-Replayed":{"description":"True when this response was replayed from an earlier request with the same Idempotency-Key.","schema":{"type":"boolean"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix time (seconds) at which the rate-limit window resets.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"Scope the rate limit was applied at.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for this request; quote it in support requests.","schema":{"type":"string"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Authentication required"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Insufficient permissions"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Not found"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Conflict"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limit exceeded","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Internal server error"}},"security":[{"ApiKeyAuth":[]}],"summary":"Update wallet","tags":["Wallets"]}},"/wallets/{id}/addresses":{"get":{"description":"Returns a paginated list of addresses for a wallet.","operationId":"getWalletsByIdAddresses","parameters":[{"description":"Wallet ID","in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}},{"description":"API version (defaults to the latest supported version if omitted).","in":"header","name":"API-Version","required":false,"schema":{"default":"v1","enum":["v1"],"type":"string"}},{"description":"Opaque cursor; returns the page after this item.","in":"query","name":"starting_after","required":false,"schema":{"type":"string"}},{"description":"Opaque cursor; returns the page before this item.","in":"query","name":"ending_before","required":false,"schema":{"type":"string"}},{"description":"Page size; bounded by the endpoint maximum.","in":"query","name":"limit","required":false,"schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"example":{"data":[{"address":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e","chain":"ethereum","created_at":"2026-05-16T10:30:00Z","id":"3f1a2b3c-4d5e-6f7a-8b9c-0d1e2f3a4b5c","is_primary":true,"label":"Customer deposits","network":"mainnet","object":"address","wallet_id":"a1b2c3d4-5e6f-7a8b-9c0d-1e2f3a4b5c6d"}],"has_more":false,"next_cursor":"","object":"list","url":""},"schema":{"properties":{"data":{"items":{"$ref":"#/components/schemas/AddressResponse"},"type":"array"},"has_more":{"type":"boolean"},"next_cursor":{"description":"Opaque cursor for the next page; pass as starting_after. Present only when has_more is true.","type":"string"},"object":{"example":"list","type":"string"},"url":{"type":"string"}},"type":"object"}}},"description":"Success","headers":{"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix time (seconds) at which the rate-limit window resets.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"Scope the rate limit was applied at.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for this request; quote it in support requests.","schema":{"type":"string"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Authentication required"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Insufficient permissions"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Not found"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limit exceeded","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Internal server error"}},"security":[{"ApiKeyAuth":[]}],"summary":"List addresses","tags":["Wallets"]},"post":{"description":"Derives an address for the wallet. Account-based chains (Ethereum / EVM L2s, Solana, Tron, TON) hold exactly one address per wallet — repeated calls with an asset_id on the same chain return the existing primary (with `X-Idempotent-Replayed: true`). Bitcoin permits multiple addresses, so each call derives a new one.","operationId":"postWalletsByIdAddresses","parameters":[{"description":"Wallet ID","in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}},{"description":"API version (defaults to the latest supported version if omitted).","in":"header","name":"API-Version","required":false,"schema":{"default":"v1","enum":["v1"],"type":"string"}},{"description":"Unique key (1-255 printable ASCII chars) used to safely retry write operations. Same key + body returns the cached response; same key + different body returns 409.","in":"header","name":"Idempotency-Key","required":true,"schema":{"maxLength":255,"minLength":1,"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateAddressRequest"}}},"required":true},"responses":{"201":{"content":{"application/json":{"example":{"address":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e","chain":"ethereum","created_at":"2026-05-16T10:30:00Z","id":"3f1a2b3c-4d5e-6f7a-8b9c-0d1e2f3a4b5c","is_primary":true,"label":"Customer deposits","network":"mainnet","object":"address","wallet_id":"a1b2c3d4-5e6f-7a8b-9c0d-1e2f3a4b5c6d"},"schema":{"$ref":"#/components/schemas/AddressResponse"}}},"description":"Created","headers":{"Idempotent-Replayed":{"description":"True when this response was replayed from an earlier request with the same Idempotency-Key.","schema":{"type":"boolean"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix time (seconds) at which the rate-limit window resets.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"Scope the rate limit was applied at.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for this request; quote it in support requests.","schema":{"type":"string"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Authentication required"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Insufficient permissions"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Not found"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Conflict"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limit exceeded","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Internal server error"}},"security":[{"ApiKeyAuth":[]}],"summary":"Create address","tags":["Wallets"]}},"/wallets/{id}/addresses/{addressId}":{"get":{"description":"Returns a single address by ID. The address must belong to the wallet in the path.","operationId":"getWalletsByIdAddressesByAddressId","parameters":[{"description":"Wallet ID","in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}},{"description":"Address ID","in":"path","name":"addressId","required":true,"schema":{"type":"string"}},{"description":"API version (defaults to the latest supported version if omitted).","in":"header","name":"API-Version","required":false,"schema":{"default":"v1","enum":["v1"],"type":"string"}}],"responses":{"200":{"content":{"application/json":{"example":{"address":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e","chain":"ethereum","created_at":"2026-05-16T10:30:00Z","id":"3f1a2b3c-4d5e-6f7a-8b9c-0d1e2f3a4b5c","is_primary":true,"label":"Customer deposits","network":"mainnet","object":"address","wallet_id":"a1b2c3d4-5e6f-7a8b-9c0d-1e2f3a4b5c6d"},"schema":{"$ref":"#/components/schemas/AddressResponse"}}},"description":"Success","headers":{"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix time (seconds) at which the rate-limit window resets.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"Scope the rate limit was applied at.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for this request; quote it in support requests.","schema":{"type":"string"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Authentication required"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Insufficient permissions"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Not found"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limit exceeded","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Internal server error"}},"security":[{"ApiKeyAuth":[]}],"summary":"Get address","tags":["Wallets"]}},"/wallets/{id}/balances":{"get":{"description":"Returns all asset balances for a wallet.","operationId":"getWalletsByIdBalances","parameters":[{"description":"Wallet ID","in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}},{"description":"API version (defaults to the latest supported version if omitted).","in":"header","name":"API-Version","required":false,"schema":{"default":"v1","enum":["v1"],"type":"string"}}],"responses":{"200":{"content":{"application/json":{"example":{"data":[],"has_more":false,"next_cursor":"","object":"list","url":""},"schema":{"properties":{"data":{"items":{"$ref":"#/components/schemas/BalanceResponse"},"type":"array"},"has_more":{"type":"boolean"},"next_cursor":{"description":"Opaque cursor for the next page; pass as starting_after. Present only when has_more is true.","type":"string"},"object":{"example":"list","type":"string"},"url":{"type":"string"}},"type":"object"}}},"description":"Success","headers":{"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix time (seconds) at which the rate-limit window resets.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"Scope the rate limit was applied at.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for this request; quote it in support requests.","schema":{"type":"string"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Authentication required"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Insufficient permissions"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Not found"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limit exceeded","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Internal server error"}},"security":[{"ApiKeyAuth":[]}],"summary":"List wallet balances","tags":["Wallets"]}},"/wallets/{id}/balances/{asset_id}":{"get":{"description":"Returns the balance for one asset in a wallet by asset ID (for example, ETH, USDT_ETH, or USDC_BASE). Amount fields are returned in raw base units; use asset_decimals for display conversion.","operationId":"getWalletsByIdBalancesByAsset_id","parameters":[{"description":"Wallet ID","in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}},{"description":"Asset ID","in":"path","name":"asset_id","required":true,"schema":{"format":"uuid","type":"string"}},{"description":"API version (defaults to the latest supported version if omitted).","in":"header","name":"API-Version","required":false,"schema":{"default":"v1","enum":["v1"],"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BalanceResponse"}}},"description":"Success","headers":{"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix time (seconds) at which the rate-limit window resets.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"Scope the rate limit was applied at.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for this request; quote it in support requests.","schema":{"type":"string"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Authentication required"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Insufficient permissions"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Not found"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limit exceeded","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Internal server error"}},"security":[{"ApiKeyAuth":[]}],"summary":"Get wallet asset balance","tags":["Wallets"]}},"/wallets/{id}/sign":{"post":{"description":"Signs an arbitrary hex or UTF-8 payload with an address in the wallet and returns the signature plus signature metadata. This does not create, broadcast, or track a transaction. Requires Idempotency-Key. If address_id is omitted, the wallet's primary address is used. EIP-712/EIP-7702 payload encodings are intentionally not accepted until policy/approval semantics are available.","operationId":"postWalletsByIdSign","parameters":[{"description":"Wallet ID","in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}},{"description":"API version (defaults to the latest supported version if omitted).","in":"header","name":"API-Version","required":false,"schema":{"default":"v1","enum":["v1"],"type":"string"}},{"description":"Unique key (1-255 printable ASCII chars) used to safely retry write operations. Same key + body returns the cached response; same key + different body returns 409.","in":"header","name":"Idempotency-Key","required":true,"schema":{"maxLength":255,"minLength":1,"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignPayloadRequest"}}},"required":true},"responses":{"201":{"content":{"application/json":{"example":{"activity_id":"activity-id","address":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e","address_id":"3f1a2b3c-4d5e-6f7a-8b9c-0d1e2f3a4b5c","algorithm":"ecdsa","chain":"ethereum","curve":"secp256k1","hash_function":"no_op","network":"mainnet","object":"signature","payload":"9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08","payload_encoding":"hexadecimal","r":"0x1","recovery_id":0,"s":"0x2","signature":"0x...","signature_encoding":"hexadecimal","signature_format":"secp256k1_recoverable_65","signed_at":"2026-05-16T10:30:00Z","signed_payload":"0x9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08","signed_payload_encoding":"hexadecimal","v":27,"wallet_id":"a1b2c3d4-5e6f-7a8b-9c0d-1e2f3a4b5c6d"},"schema":{"$ref":"#/components/schemas/SignatureResponse"}}},"description":"Created","headers":{"Idempotent-Replayed":{"description":"True when this response was replayed from an earlier request with the same Idempotency-Key.","schema":{"type":"boolean"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix time (seconds) at which the rate-limit window resets.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"Scope the rate limit was applied at.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for this request; quote it in support requests.","schema":{"type":"string"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Authentication required"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Insufficient permissions"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Not found"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Conflict"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limit exceeded","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Internal server error"}},"security":[{"ApiKeyAuth":[]}],"summary":"Sign payload","tags":["Wallets"]}},"/wallets/{id}/utxos":{"get":{"description":"Returns a paginated, filterable list of a Bitcoin wallet's UTXOs (value, confirmations, script, and reserved/held/spendable status). Use the spendable filter to get the coins a send can pin via the transaction `inputs` field. Bitcoin only.","operationId":"getWalletsByIdUtxos","parameters":[{"description":"Wallet ID","in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}},{"description":"API version (defaults to the latest supported version if omitted).","in":"header","name":"API-Version","required":false,"schema":{"default":"v1","enum":["v1"],"type":"string"}},{"description":"Opaque cursor; returns the page after this item.","in":"query","name":"starting_after","required":false,"schema":{"type":"string"}},{"description":"Opaque cursor; returns the page before this item.","in":"query","name":"ending_before","required":false,"schema":{"type":"string"}},{"description":"Page size; bounded by the endpoint maximum.","in":"query","name":"limit","required":false,"schema":{"type":"integer"}},{"description":"Filter to a single owning address.","in":"query","name":"address","required":false,"schema":{"type":"string"}},{"description":"Filter by chain state.","in":"query","name":"status","required":false,"schema":{"enum":["confirmed","unconfirmed"],"type":"string"}},{"description":"Set to \"true\" to return only coins selectable for a spend (matured, unheld, unreserved).","in":"query","name":"spendable","required":false,"schema":{"enum":["true","false"],"type":"string"}},{"description":"Minimum value in satoshis (non-negative integer).","in":"query","name":"min_value","required":false,"schema":{"type":"string"}},{"description":"Maximum value in satoshis (non-negative integer; must be \u003e= min_value).","in":"query","name":"max_value","required":false,"schema":{"type":"string"}},{"description":"Minimum confirmations (non-negative).","in":"query","name":"min_confirms","required":false,"schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"example":{"data":[{"address":"bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4","block_height":845120,"confirmations":12,"confirmed":true,"created_at":"2026-05-16T10:30:00Z","derivation_path":"m/84'/0'/0'/0/5","hold_status":"none","is_change":false,"object":"utxo","outpoint":"de64fb866d99a42d857698ec5c383c9eb8f8a9d2596fdf556a8bba95a5bcc070:0","reserved":false,"script_pubkey":"0014a1b2","script_type":"p2wpkh","spendable":true,"txid":"de64fb866d99a42d857698ec5c383c9eb8f8a9d2596fdf556a8bba95a5bcc070","value":"90000","vout":"0"}],"has_more":false,"next_cursor":"","object":"list","url":""},"schema":{"properties":{"data":{"items":{"$ref":"#/components/schemas/UTXOResponse"},"type":"array"},"has_more":{"type":"boolean"},"next_cursor":{"description":"Opaque cursor for the next page; pass as starting_after. Present only when has_more is true.","type":"string"},"object":{"example":"list","type":"string"},"url":{"type":"string"}},"type":"object"}}},"description":"Success","headers":{"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix time (seconds) at which the rate-limit window resets.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"Scope the rate limit was applied at.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for this request; quote it in support requests.","schema":{"type":"string"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Authentication required"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Insufficient permissions"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Not found"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limit exceeded","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Internal server error"}},"security":[{"ApiKeyAuth":[]}],"summary":"List wallet UTXOs","tags":["Wallets"]}},"/webhooks":{"get":{"description":"Returns webhook endpoints for the organization.","operationId":"getWebhooks","parameters":[{"description":"API version (defaults to the latest supported version if omitted).","in":"header","name":"API-Version","required":false,"schema":{"default":"v1","enum":["v1"],"type":"string"}},{"description":"Opaque cursor; returns the page after this item.","in":"query","name":"starting_after","required":false,"schema":{"type":"string"}},{"description":"Opaque cursor; returns the page before this item.","in":"query","name":"ending_before","required":false,"schema":{"type":"string"}},{"description":"Page size; bounded by the endpoint maximum.","in":"query","name":"limit","required":false,"schema":{"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"example":{"data":[{"created_at":"2026-05-16T10:30:00Z","has_signing_secret":true,"id":"7c9e6679-7425-40de-944b-e07fc1f90ae7","last_triggered_at":"2026-05-16T10:30:00Z","name":"Production notifications","object":"webhook","status":"active","updated_at":"2026-05-16T10:30:00Z","url":"https://example.com/webhooks/bitnob"}],"has_more":false,"next_cursor":"","object":"list","url":""},"schema":{"properties":{"data":{"items":{"$ref":"#/components/schemas/WebhookResponse"},"type":"array"},"has_more":{"type":"boolean"},"next_cursor":{"description":"Opaque cursor for the next page; pass as starting_after. Present only when has_more is true.","type":"string"},"object":{"example":"list","type":"string"},"url":{"type":"string"}},"type":"object"}}},"description":"Success","headers":{"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix time (seconds) at which the rate-limit window resets.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"Scope the rate limit was applied at.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for this request; quote it in support requests.","schema":{"type":"string"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Authentication required"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Insufficient permissions"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limit exceeded","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Internal server error"}},"security":[{"ApiKeyAuth":[]}],"summary":"List webhooks","tags":["Webhooks"]},"post":{"description":"Registers a new webhook endpoint for platform notifications. The signing secret is returned once at creation time; subsequent reads do not include it. Pass event_types to filter to a subset, or omit to receive every event the platform emits.","operationId":"postWebhooks","parameters":[{"description":"API version (defaults to the latest supported version if omitted).","in":"header","name":"API-Version","required":false,"schema":{"default":"v1","enum":["v1"],"type":"string"}},{"description":"Unique key (1-255 printable ASCII chars) used to safely retry write operations. Same key + body returns the cached response; same key + different body returns 409.","in":"header","name":"Idempotency-Key","required":false,"schema":{"maxLength":255,"minLength":1,"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateWebhookRequest"}}},"required":true},"responses":{"201":{"content":{"application/json":{"example":{"created_at":"2026-05-16T10:30:00Z","has_signing_secret":true,"id":"7c9e6679-7425-40de-944b-e07fc1f90ae7","last_triggered_at":"2026-05-16T10:30:00Z","name":"Production notifications","object":"webhook","status":"active","updated_at":"2026-05-16T10:30:00Z","url":"https://example.com/webhooks/bitnob"},"schema":{"$ref":"#/components/schemas/WebhookResponse"}}},"description":"Created","headers":{"Idempotent-Replayed":{"description":"True when this response was replayed from an earlier request with the same Idempotency-Key.","schema":{"type":"boolean"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix time (seconds) at which the rate-limit window resets.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"Scope the rate limit was applied at.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for this request; quote it in support requests.","schema":{"type":"string"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Authentication required"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Insufficient permissions"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Conflict"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limit exceeded","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Internal server error"}},"security":[{"ApiKeyAuth":[]}],"summary":"Create webhook","tags":["Webhooks"]}},"/webhooks/event-types":{"get":{"description":"Returns the canonical list of all platform event types that can be delivered to webhook endpoints. Use these values in the event_types filter when creating or updating a webhook.","operationId":"getWebhooksEvent-types","parameters":[{"description":"API version (defaults to the latest supported version if omitted).","in":"header","name":"API-Version","required":false,"schema":{"default":"v1","enum":["v1"],"type":"string"}}],"responses":{"200":{"content":{"application/json":{"example":{"data":[{"category":"transaction","name":"Transaction confirmed","type":"transaction.confirmed"}],"has_more":false,"next_cursor":"","object":"list","url":""},"schema":{"properties":{"data":{"items":{"$ref":"#/components/schemas/WebhookEventTypeResponse"},"type":"array"},"has_more":{"type":"boolean"},"next_cursor":{"description":"Opaque cursor for the next page; pass as starting_after. Present only when has_more is true.","type":"string"},"object":{"example":"list","type":"string"},"url":{"type":"string"}},"type":"object"}}},"description":"Success","headers":{"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix time (seconds) at which the rate-limit window resets.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"Scope the rate limit was applied at.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for this request; quote it in support requests.","schema":{"type":"string"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Authentication required"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Insufficient permissions"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limit exceeded","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Internal server error"}},"security":[{"ApiKeyAuth":[]}],"summary":"List supported event types","tags":["Webhooks"]}},"/webhooks/events":{"get":{"description":"Returns a paginated list of platform notification deliveries for this organization across all webhook endpoints, newest first. Filter to a single endpoint with the webhook_id query param.","operationId":"getWebhooksEvents","parameters":[{"description":"API version (defaults to the latest supported version if omitted).","in":"header","name":"API-Version","required":false,"schema":{"default":"v1","enum":["v1"],"type":"string"}},{"description":"Opaque cursor; returns the page after this item.","in":"query","name":"starting_after","required":false,"schema":{"type":"string"}},{"description":"Opaque cursor; returns the page before this item.","in":"query","name":"ending_before","required":false,"schema":{"type":"string"}},{"description":"Page size; bounded by the endpoint maximum.","in":"query","name":"limit","required":false,"schema":{"type":"integer"}},{"description":"Filter by delivery status.","in":"query","name":"status","required":false,"schema":{"enum":["pending","delivered","failed"],"type":"string"}},{"description":"Narrow the listing to a single webhook.","in":"query","name":"webhook_id","required":false,"schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"content":{"application/json":{"example":{"data":[{"created_at":"2026-05-16T10:30:00Z","delivered_at":"2026-05-16T10:30:00Z","delivery_attempts":1,"delivery_status":"delivered","destination":"https://example.com/webhooks/bitnob","http_status_code":200,"id":"9b2e7a1c-3d4f-4a8b-9c0d-1e2f3a4b5c6d","max_attempts":5,"next_retry_at":"2026-05-16T10:30:00Z","object":"event","type":"transaction.confirmed","webhook_id":"7c9e6679-7425-40de-944b-e07fc1f90ae7"}],"has_more":false,"next_cursor":"","object":"list","url":""},"schema":{"properties":{"data":{"items":{"$ref":"#/components/schemas/EventResponse"},"type":"array"},"has_more":{"type":"boolean"},"next_cursor":{"description":"Opaque cursor for the next page; pass as starting_after. Present only when has_more is true.","type":"string"},"object":{"example":"list","type":"string"},"url":{"type":"string"}},"type":"object"}}},"description":"Success","headers":{"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix time (seconds) at which the rate-limit window resets.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"Scope the rate limit was applied at.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for this request; quote it in support requests.","schema":{"type":"string"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Authentication required"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Insufficient permissions"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limit exceeded","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Internal server error"}},"security":[{"ApiKeyAuth":[]}],"summary":"List webhook delivery events","tags":["Webhooks"]}},"/webhooks/events/{id}":{"get":{"description":"Returns a single delivery event by ID. The event must belong to a webhook owned by the caller's organization.","operationId":"getWebhooksEventsById","parameters":[{"description":"Event ID","in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}},{"description":"API version (defaults to the latest supported version if omitted).","in":"header","name":"API-Version","required":false,"schema":{"default":"v1","enum":["v1"],"type":"string"}}],"responses":{"200":{"content":{"application/json":{"example":{"created_at":"2026-05-16T10:30:00Z","delivered_at":"2026-05-16T10:30:00Z","delivery_attempts":1,"delivery_status":"delivered","destination":"https://example.com/webhooks/bitnob","http_status_code":200,"id":"9b2e7a1c-3d4f-4a8b-9c0d-1e2f3a4b5c6d","max_attempts":5,"next_retry_at":"2026-05-16T10:30:00Z","object":"event","type":"transaction.confirmed","webhook_id":"7c9e6679-7425-40de-944b-e07fc1f90ae7"},"schema":{"$ref":"#/components/schemas/EventResponse"}}},"description":"Success","headers":{"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix time (seconds) at which the rate-limit window resets.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"Scope the rate limit was applied at.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for this request; quote it in support requests.","schema":{"type":"string"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Authentication required"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Insufficient permissions"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Not found"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limit exceeded","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Internal server error"}},"security":[{"ApiKeyAuth":[]}],"summary":"Get webhook delivery event","tags":["Webhooks"]}},"/webhooks/events/{id}/retry":{"post":{"description":"Re-queues the specified platform notification delivery for another attempt. Org ownership is enforced via the delivery's parent webhook.","operationId":"postWebhooksEventsByIdRetry","parameters":[{"description":"Event ID","in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}},{"description":"API version (defaults to the latest supported version if omitted).","in":"header","name":"API-Version","required":false,"schema":{"default":"v1","enum":["v1"],"type":"string"}},{"description":"Unique key (1-255 printable ASCII chars) used to safely retry write operations. Same key + body returns the cached response; same key + different body returns 409.","in":"header","name":"Idempotency-Key","required":false,"schema":{"maxLength":255,"minLength":1,"type":"string"}}],"responses":{"200":{"content":{"application/json":{"example":{"object":"event_retry","status":"queued"},"schema":{"$ref":"#/components/schemas/EventRetryResponse"}}},"description":"Success","headers":{"Idempotent-Replayed":{"description":"True when this response was replayed from an earlier request with the same Idempotency-Key.","schema":{"type":"boolean"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix time (seconds) at which the rate-limit window resets.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"Scope the rate limit was applied at.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for this request; quote it in support requests.","schema":{"type":"string"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Authentication required"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Insufficient permissions"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Not found"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Conflict"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limit exceeded","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Internal server error"}},"security":[{"ApiKeyAuth":[]}],"summary":"Retry webhook delivery","tags":["Webhooks"]}},"/webhooks/{id}":{"delete":{"description":"Soft-deletes a webhook endpoint.","operationId":"deleteWebhooksById","parameters":[{"description":"Webhook ID","in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}},{"description":"API version (defaults to the latest supported version if omitted).","in":"header","name":"API-Version","required":false,"schema":{"default":"v1","enum":["v1"],"type":"string"}},{"description":"Unique key (1-255 printable ASCII chars) used to safely retry write operations. Same key + body returns the cached response; same key + different body returns 409.","in":"header","name":"Idempotency-Key","required":false,"schema":{"maxLength":255,"minLength":1,"type":"string"}}],"responses":{"204":{"description":"No Content","headers":{"Idempotent-Replayed":{"description":"True when this response was replayed from an earlier request with the same Idempotency-Key.","schema":{"type":"boolean"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix time (seconds) at which the rate-limit window resets.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"Scope the rate limit was applied at.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for this request; quote it in support requests.","schema":{"type":"string"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Authentication required"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Insufficient permissions"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Not found"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Conflict"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limit exceeded","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Internal server error"}},"security":[{"ApiKeyAuth":[]}],"summary":"Delete webhook","tags":["Webhooks"]},"get":{"description":"Returns a single webhook endpoint by ID.","operationId":"getWebhooksById","parameters":[{"description":"Webhook ID","in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}},{"description":"API version (defaults to the latest supported version if omitted).","in":"header","name":"API-Version","required":false,"schema":{"default":"v1","enum":["v1"],"type":"string"}}],"responses":{"200":{"content":{"application/json":{"example":{"created_at":"2026-05-16T10:30:00Z","has_signing_secret":true,"id":"7c9e6679-7425-40de-944b-e07fc1f90ae7","last_triggered_at":"2026-05-16T10:30:00Z","name":"Production notifications","object":"webhook","status":"active","updated_at":"2026-05-16T10:30:00Z","url":"https://example.com/webhooks/bitnob"},"schema":{"$ref":"#/components/schemas/WebhookResponse"}}},"description":"Success","headers":{"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix time (seconds) at which the rate-limit window resets.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"Scope the rate limit was applied at.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for this request; quote it in support requests.","schema":{"type":"string"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Authentication required"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Insufficient permissions"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Not found"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limit exceeded","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Internal server error"}},"security":[{"ApiKeyAuth":[]}],"summary":"Get webhook","tags":["Webhooks"]},"patch":{"description":"Updates a webhook endpoint's URL, name, or event-type filter.","operationId":"patchWebhooksById","parameters":[{"description":"Webhook ID","in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}},{"description":"API version (defaults to the latest supported version if omitted).","in":"header","name":"API-Version","required":false,"schema":{"default":"v1","enum":["v1"],"type":"string"}},{"description":"Unique key (1-255 printable ASCII chars) used to safely retry write operations. Same key + body returns the cached response; same key + different body returns 409.","in":"header","name":"Idempotency-Key","required":false,"schema":{"maxLength":255,"minLength":1,"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateWebhookRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"example":{"created_at":"2026-05-16T10:30:00Z","has_signing_secret":true,"id":"7c9e6679-7425-40de-944b-e07fc1f90ae7","last_triggered_at":"2026-05-16T10:30:00Z","name":"Production notifications","object":"webhook","status":"active","updated_at":"2026-05-16T10:30:00Z","url":"https://example.com/webhooks/bitnob"},"schema":{"$ref":"#/components/schemas/WebhookResponse"}}},"description":"Success","headers":{"Idempotent-Replayed":{"description":"True when this response was replayed from an earlier request with the same Idempotency-Key.","schema":{"type":"boolean"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix time (seconds) at which the rate-limit window resets.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"Scope the rate limit was applied at.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for this request; quote it in support requests.","schema":{"type":"string"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Authentication required"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Insufficient permissions"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Not found"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Conflict"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limit exceeded","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Internal server error"}},"security":[{"ApiKeyAuth":[]}],"summary":"Update webhook","tags":["Webhooks"]}},"/webhooks/{id}/rotate-secret":{"post":{"description":"Generates a new signing secret. The new secret is returned once.","operationId":"postWebhooksByIdRotate-secret","parameters":[{"description":"Webhook ID","in":"path","name":"id","required":true,"schema":{"format":"uuid","type":"string"}},{"description":"API version (defaults to the latest supported version if omitted).","in":"header","name":"API-Version","required":false,"schema":{"default":"v1","enum":["v1"],"type":"string"}},{"description":"Unique key (1-255 printable ASCII chars) used to safely retry write operations. Same key + body returns the cached response; same key + different body returns 409.","in":"header","name":"Idempotency-Key","required":false,"schema":{"maxLength":255,"minLength":1,"type":"string"}}],"responses":{"200":{"content":{"application/json":{"example":{"object":"signing_secret"},"schema":{"$ref":"#/components/schemas/SigningSecretResponse"}}},"description":"Success","headers":{"Idempotent-Replayed":{"description":"True when this response was replayed from an earlier request with the same Idempotency-Key.","schema":{"type":"boolean"}},"X-RateLimit-Limit":{"description":"Requests permitted in the current window.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"Unix time (seconds) at which the rate-limit window resets.","schema":{"type":"integer"}},"X-RateLimit-Scope":{"description":"Scope the rate limit was applied at.","schema":{"type":"string"}},"X-Request-Id":{"description":"Unique id for this request; quote it in support requests.","schema":{"type":"string"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Invalid request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Authentication required"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Insufficient permissions"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Not found"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Conflict"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Rate limit exceeded","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Internal server error"}},"security":[{"ApiKeyAuth":[]}],"summary":"Rotate signing secret","tags":["Webhooks"]}}},"security":[{"ApiKeyAuth":[]}],"servers":[{"description":"Production","url":"https://api.platform.bitnob.com"}]}